<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=307529&amp;view=findpost&amp;p=2634900</guid>
        <pubDate>Thu, 01 Jul 2010 15:09:46 +0000</pubDate>
        <title>Сохранение/чтение настроек в XML</title>
        <link>https://forum.sources.ru/index.php?showtopic=307529&amp;view=findpost&amp;p=2634900</link>
        <description><![CDATA[B.V.: В нашем FAQ есть примеры загрузки и сохранения настроек посредством Get/SaveSetting и Get/WritePrivateProfileString, но нет посредством xml-парсера. Решил исправить это недоразумение, набросал короткий, но, по-моему, достаточно понятный и подробный пример<br>
<br>
Процедура сохранения<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Private Sub SaveSettingsToXML()</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim objXMLDoc As New DOMDocument</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim objRootNode As IXMLDOMNode, objCurrentNode As IXMLDOMNode</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Создаем корневой узел</div><div class="code_line">&nbsp;&nbsp; &nbsp;Set objRootNode = objXMLDoc.createNode(NODE_ELEMENT, &quot;settings&quot;, &quot;&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Call objXMLDoc.appendChild(objRootNode)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;If Me.WindowState = vbNormal Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Создаем узел, содержащий размеры формы</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Set objCurrentNode = objXMLDoc.createNode(NODE_ELEMENT, &quot;form_size&quot;, &quot;&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;И задаем ему в качестве аттрибутов размеры</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute(&quot;left&quot;)).Text = Str$(Me.Left)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute(&quot;top&quot;)).Text = Str$(Me.Top)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute(&quot;width&quot;)).Text = Str$(Me.Width)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute(&quot;height&quot;)).Text = Str$(Me.Height)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Call InsertWhiteSpace(objRootNode, vbCrLf + vbTab)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Call objRootNode.appendChild(objCurrentNode)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Call InsertWhiteSpace(objRootNode, vbCrLf + vbTab)</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Создаем узел, содержащий текст из нашего текстового поля</div><div class="code_line">&nbsp;&nbsp; &nbsp;Set objCurrentNode = objXMLDoc.createNode(NODE_ELEMENT, &quot;text&quot;, &quot;&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute(&quot;text_length&quot;)).Text = Str$(Len(Text1.Text))</div><div class="code_line">&nbsp;&nbsp; &nbsp;objCurrentNode.Text = Text1.Text</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Call objRootNode.appendChild(objCurrentNode)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Call InsertWhiteSpace(objRootNode)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Call objXMLDoc.save(XML_FILE)</div><div class="code_line">End Sub</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Процедура загрузки<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Private Sub LoadSettingsFromXML()</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim objXMLDoc As New DOMDocument</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim objRootNode As IXMLDOMNode, objCurrentNode As IXMLDOMNode</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;objXMLDoc.async = False</div><div class="code_line">&nbsp;&nbsp; &nbsp;objXMLDoc.validateOnParse = False</div><div class="code_line">&nbsp;&nbsp; &nbsp;If Not objXMLDoc.Load(XML_FILE) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Err.Raise objXMLDoc.parseError.errorCode, , objXMLDoc.parseError.reason</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Set objRootNode = objXMLDoc.selectSingleNode(&quot;settings&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Выбираем узел с размерами и читаем его аттрибуты</div><div class="code_line">&nbsp;&nbsp; &nbsp;Set objCurrentNode = objRootNode.selectSingleNode(&quot;form_size&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;With Me</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;.Left = Val(objCurrentNode.Attributes.getNamedItem(&quot;left&quot;).Text)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;.Top = Val(objCurrentNode.Attributes.getNamedItem(&quot;top&quot;).Text)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;.Width = Val(objCurrentNode.Attributes.getNamedItem(&quot;width&quot;).Text)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;.Height = Val(objCurrentNode.Attributes.getNamedItem(&quot;height&quot;).Text)</div><div class="code_line">&nbsp;&nbsp; &nbsp;End With</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Выбираем узел с текстом и читаем его значение</div><div class="code_line">&nbsp;&nbsp; &nbsp;Text1.Text = Replace(objRootNode.selectSingleNode(&quot;text&quot;).Text, vbLf, vbCrLf)</div><div class="code_line">End Sub</div></ol></div></div></div></div><br>
<br>
Для начала этого должно быть достаточно. У парсера MSXML еще есть целый ряд полезных классов, как, например, IXMLDOMNodeList -- позволяет последовательно (или в желаемом порядке) читать дочерние узлы документа или другого узла. Полезно при загрузке множества одинаковых узлов, как, например, в списках воспроизведения. За подробностями советую пойти сюда: http://msdn.microsoft.com/en-us/library/ms760218.aspx<br>
<br>
Полный код в примере, в аттаче]]></description>
        <author>B.V.</author>
        <category>Настройки, реестр, ini</category>
      </item>
	
      </channel>
      </rss>
	