Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: loadXML Добавлено: 22.03.07 20:54  

Автор вопроса:  fm458
Метод .loadXML("<?xml version=""1.0""?>") возвращает false и соответственно ничего в файл не записывается. Не пойму, что же ему в этой строчке не нравится???


Dim objDom As DOMDocument
Set objDom = New DOMDocument

objDom.async = False
MsgBox objDom.loadXML("<?xml version=""1.0""?>")

objDom.save (App.Path & "\test.xml")

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 VerhoLom



Вопросов: 20
Ответов: 285
 Профиль | | #1 Добавлено: 25.03.07 19:11
Программировать DOMDocument несколько сумбурно, но можно. В некоторых местах в качестве обработки ошибок задействуются механизмы самой MSXML, а в некоторых - механизмы языка программирования (например, невозможность записи в файл). Так что, писать надо внимательно и, главное, делать в сомнительных местах тройную проверку ошибок: через объект обработки ошибок парсера, предоставляемый самой библиотекой (вообще-то это целесообразно делать там, где может быть ошибка именно в структуре кода XML: незакрытый тег и т. д.), и использовать любимый всеми нами On error ... (лично я предпочитаю On Error Resume Next, так как существует возможность проверить код ошибки безо всяких переходов по меткам (вот не люблю я их)) и проверять объект на Nothing (обычно это надо делать при выборке подузлов документа).

Теперь о том, в чем ошибка: пишите без знаков вопроса и все пойдет. Ниже - пример обработки таких вот ошибок (я использую DOMDocument30, но можно и просто DOMDocument):

[CODE]Sub CreateAndWriteXML()
    Dim dom As MSXML2.DOMDocument30
    
    Set dom = New MSXML2.DOMDocument30
    With dom
        .loadXML "<xml version=" & Chr$(34) & "1.0" & Chr$(34) & "/>"
        'А можно и по Вашему, тогда будет сообщение об ошибке:
        '.loadXML "<xml version=" & Chr$(34) & "1.0" & Chr$(34) & "/>"
        With .parseError
            If .errorCode <> 0 Then
                MsgBox "errorCode = " & CStr(.errorCode) & vbCrLf & _
                        "filepos = " & CStr(.filepos) & vbCrLf & _
                        "Line = " & CStr(.Line) & vbCrLf & _
                        "linepos = " & CStr(.linepos) & vbCrLf & _
                        "reason (Message) = [" & .reason & "]" & vbCrLf & _
                        "srcText = [" & .srcText & "]" & vbCrLf & _
                        "URL = [" & .url & "]" _
                        , vbCritical, "xmlDom error..."
            End If
        End With
        
        On Error Resume Next
        .Save "c:\11\main.xml"
        If Err Then
            MsgBox Err.Description, vbCritical, "Error writing file..."
        End If
        On Error GoTo 0
    End With
    Set dom = Nothing
End Sub

И еще: если есть MSDN - там MSXML довольно таки неплохо описан. В SQL Server Books Online - тоже.

Ответить

Номер ответа: 2
Автор ответа:
 VerhoLom



Вопросов: 20
Ответов: 285
 Профиль | | #2 Добавлено: 25.03.07 19:31
Вот вырезка, которая возвращает содержимое ListView Control в виде DomDocument:



'Вернет содержимое списка ListView в виде XML
Public Function GetXMLFromLV(ByRef lv As ListView, ByVal sRoot As String, ByVal sItem As String) As DOMDocument30
    Dim xmlDoc As New DOMDocument30
    Dim xmlChild1 As IXMLDOMNode, xmlChild2 As IXMLDOMNode, xmlRoot As IXMLDOMNode
    Dim lvCH As ColumnHeader, lvLI As ListItem
    Dim iChildsCnt As Integer
    
    'Создаем корневой элемент в XML-документе
    Set xmlRoot = xmlDoc.createNode(NODE_ELEMENT, sRoot, "";)
    
    'Идем по всем строкам списка
    For Each lvLI In lv.ListItems
        'Создаем дочерний узел
        Set xmlChild1 = xmlDoc.createNode(NODE_ELEMENT, sItem, "";)
        
        iChildsCnt = -1
        'Идем по всем столбцам и создаем дочерние подэлементы
        For Each lvCH In lv.ColumnHeaders
            iChildsCnt = iChildsCnt + 1
            Set xmlChild2 = xmlDoc.createNode(NODE_ELEMENT, lvCH.Tag, "";)
            If iChildsCnt = 0 Then
                xmlChild2.Text = lvLI.Text
            Else
                xmlChild2.Text = lvLI.SubItems(iChildsCnt)
            End If
            
            'Добавляем дочерний элемент k xmlChild1
            xmlChild1.appendChild xmlChild2
            
            Set xmlChild2 = Nothing
        Next
        
        'Добавляем xmlChild1 k xmlRoot
        xmlRoot.appendChild xmlChild1
    Next
    
    'Добавляем xmlRoot k xmlDoc
    xmlDoc.appendChild xmlRoot
    Set GetXMLFromLV = xmlDoc
    
    Set xmlDoc = Nothing
    Set xmlRoot = Nothing
    Set xmlChild2 = Nothing
    Set xmlChild1 = Nothing
End Function



У меня все столбцы ListView имеют заполненное свойство Tag, которое используется в каестве имени дочернего элемента. Следите за тем, чтобы у Вас было свое.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам