Механизм сохранения/изменения иерархических структур данных

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.03.2008 (Сб) 21:18

Я бы не хотел твой пример переделывать. Было бы более справедливо, если бы сторона, заинтересованная в лучших результатах у XML в этом benchmark-е сам делала код.

А то я ошибусь, напишу менее быстрый код, чем это возможно, - будите потом обвинять в предвзятости :lol:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.03.2008 (Вт) 12:00

Код: Выделить всё
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
Код не проверял, лень писать генерилку значений.
Лучший способ понять что-то самому — объяснить это другому.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: The trick и гости: 21

    TopList  
cron