На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: SCINER, B.V.
  
    > Сохранение/чтение настроек в XML, работа с xml в VB6
      В нашем FAQ есть примеры загрузки и сохранения настроек посредством Get/SaveSetting и Get/WritePrivateProfileString, но нет посредством xml-парсера. Решил исправить это недоразумение, набросал короткий, но, по-моему, достаточно понятный и подробный пример

      Процедура сохранения
      ExpandedWrap disabled
        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


      Процедура загрузки
      ExpandedWrap disabled
        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

      Полный код в примере, в аттаче
      Прикреплённый файлПрикреплённый файл (2.33 Кбайт, скачиваний: 338)
      char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
      for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


      user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0719 ]   [ 17 queries used ]   [ Generated: 21.11.19, 23:53 GMT ]