Страница: 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")
Ответить
|
Номер ответа: 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 |
Поиск по форуму