А то я ошибусь, напишу менее быстрый код, чем это возможно, - будите потом обвинять в предвзятости

Dim mDoc As New DOMDocument
Public Sub SaveDoodah(ByVal sFileName As String, ByVal TopLevelItems As Collection)
' Вот, собственно, и весь юникод, об остальном позаботится msxml
' V
mDoc.loadXML "<?xml version='1.0' encoding='utf-8' ?><root></root>"
EnumSave mDoc.childNodes(1), TopLevelItems
mDoc.save sFileName
End Sub
Public Function LoadDoodahs(ByVal sFileName As String) As Collection
Dim cd As New CDoodah
Set cd.Children = New Collection
mDoc.Load sFileName
EnumLoad mDoc.childNodes(1), cd
Set LoadDoodahs = cd.Children
End Function
Private Sub EnumSave(node As IXMLDOMElement, col As Collection)
Dim cd As CDoodah
Dim el As IXMLDOMElement
For Each cd In col
Set el = node.appendChild(mDoc.createElement("CDoodah"))
If Len(cd.Bar) Then AddAttribute el, "Bar", cd.Bar 'нулевые значения
If Len(cd.Foo) Then AddAttribute el, "Foo", cd.Foo 'не сохраняем
If cd.Quux Then AddAttribute el, "Quux", cd.Quux 'для экономии места
'Кстати это еще один плюсик в копилку xml - не нужно лишних телодвижений при необходимости хранить null, с чем в бинарном формате могут возникнуть трудности
EnumSave el, cd.Children
Next
End Sub
Private Sub EnumLoad(node As IXMLDOMElement, Parent As CDoodah)
Dim cd As New CDoodah
Dim el As IXMLDOMElement
For Each el In node.childNodes
Set el = node.appendChild(mDoc.createElement("CDoodah"))
cd.Bar = CString(el.getAttribute("Bar"))
cd.Foo = CString(el.getAttribute("Foo"))
cd.Quux = CLong(el.getAttribute("Quux"))
Set cd.Children = New Collection
Parent.AddChild cd
EnumLoad el, cd
Next
End Sub
Private Sub AddAttribute(xmlNode As IXMLDOMElement, Name As String, Value As String)
With xmlNode
.setAttributeNode .ownerDocument.createAttribute(Name)
.setAttribute Name, Value
End With
End Sub
Private Function CLong(v) As Long
If Not IsNull(v) Then CLong = CLng(v)
End Function
Private Function CString(v) As String
If Not IsNull(v) Then CString = CStr(v)
End Function
Сейчас этот форум просматривают: Yandex-бот и гости: 4