Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual Basic: Общие вопросы > Сохранение/чтение настроек в XML


Автор: B.V. 01.07.10, 15:09
В нашем FAQ есть примеры загрузки и сохранения настроек посредством Get/SaveSetting и Get/WritePrivateProfileString, но нет посредством xml-парсера. Решил исправить это недоразумение, набросал короткий, но, по-моему, достаточно понятный и подробный пример

Процедура сохранения
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Private Sub SaveSettingsToXML()
        Dim objXMLDoc As New DOMDocument
        Dim objRootNode As IXMLDOMNode, objCurrentNode As IXMLDOMNode
        
        'Создаем корневой узел
        Set objRootNode = objXMLDoc.createNode(NODE_ELEMENT, "settings", "")
        Call objXMLDoc.appendChild(objRootNode)
     
        If Me.WindowState = vbNormal Then
            'Создаем узел, содержащий размеры формы
            Set objCurrentNode = objXMLDoc.createNode(NODE_ELEMENT, "form_size", "")
        
            'И задаем ему в качестве аттрибутов размеры
            objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute("left")).Text = Str$(Me.Left)
            objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute("top")).Text = Str$(Me.Top)
            objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute("width")).Text = Str$(Me.Width)
            objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute("height")).Text = Str$(Me.Height)
        
            Call InsertWhiteSpace(objRootNode, vbCrLf + vbTab)
            Call objRootNode.appendChild(objCurrentNode)
            Call InsertWhiteSpace(objRootNode, vbCrLf + vbTab)
        End If
     
        'Создаем узел, содержащий текст из нашего текстового поля
        Set objCurrentNode = objXMLDoc.createNode(NODE_ELEMENT, "text", "")
        objCurrentNode.Attributes.setNamedItem(objXMLDoc.createAttribute("text_length")).Text = Str$(Len(Text1.Text))
        objCurrentNode.Text = Text1.Text
        
        Call objRootNode.appendChild(objCurrentNode)
        Call InsertWhiteSpace(objRootNode)
        
        Call objXMLDoc.save(XML_FILE)
    End Sub


Процедура загрузки
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Private Sub LoadSettingsFromXML()
        Dim objXMLDoc As New DOMDocument
        Dim objRootNode As IXMLDOMNode, objCurrentNode As IXMLDOMNode
        
        objXMLDoc.async = False
        objXMLDoc.validateOnParse = False
        If Not objXMLDoc.Load(XML_FILE) Then
            Err.Raise objXMLDoc.parseError.errorCode, , objXMLDoc.parseError.reason
        End If
     
        Set objRootNode = objXMLDoc.selectSingleNode("settings")
        'Выбираем узел с размерами и читаем его аттрибуты
        Set objCurrentNode = objRootNode.selectSingleNode("form_size")
        With Me
            .Left = Val(objCurrentNode.Attributes.getNamedItem("left").Text)
            .Top = Val(objCurrentNode.Attributes.getNamedItem("top").Text)
            .Width = Val(objCurrentNode.Attributes.getNamedItem("width").Text)
            .Height = Val(objCurrentNode.Attributes.getNamedItem("height").Text)
        End With
        
        'Выбираем узел с текстом и читаем его значение
        Text1.Text = Replace(objRootNode.selectSingleNode("text").Text, vbLf, vbCrLf)
    End Sub


Для начала этого должно быть достаточно. У парсера MSXML еще есть целый ряд полезных классов, как, например, IXMLDOMNodeList -- позволяет последовательно (или в желаемом порядке) читать дочерние узлы документа или другого узла. Полезно при загрузке множества одинаковых узлов, как, например, в списках воспроизведения. За подробностями советую пойти сюда: http://msdn.microsoft.com/en-us/library/ms760218.aspx

Полный код в примере, в аттаче

Добавлено
Если что-то упустил, просьба поправить, внесу необходимые корректировки :)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)