Как добавить одинаковый префикс для каждого узла в xml? - PullRequest
1 голос
/ 07 января 2020

Мне нужно создать xml -файл в VBA, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<lhd:supernode>
    <lhd:year>2020</lhd:year>
    <lhd:month>12</lhd:monat>
    ...
    <lhd:subnode>
        <lhd:hereToo>770</lhd:hereToo>
    </lhd:subnode> 
</lhd:supernode>  

В настоящее время я использую MSXML2.DOMDocument60 для создания xml -файла. Вот код, который я сейчас использую (упрощенно):

Dim dXMLDokument As MSXML2.DOMDocument60
dim dXmlsupernode as IXMLDOMElement
Dim subnode As IXMLDOMElement

Set dXMLDokument = New MSXML2.DOMDocument60
Call dXMLDokument.appendChild(dXMLDokument.createProcessingInstruction("xml", "version=""1.0"""))
Set dXmlsupernode = dXMLDokument.createElement("lhd:supernode")

'Add lhd:year and lhd:month to dXmlsupernode

Set subnode = dXMLDokument.createElement("lhd:subnode")

'Add lhd:hereToo to subnode

Call dXmlsupernode.appendChild(subnode)
Call dXMLDokument.appendChild(subnode)

Call dXMLDokument.save(dFilename)

Как видите, в названии каждого узла есть строка: "lhd:". Для меня это выглядит как некая функциональность, встроенная в xml. Итак:

Есть ли встроенный способ добавить «lhd:» к каждому узлу в xml?

1 Ответ

0 голосов
/ 07 января 2020

Попробуйте использовать createNode , чтобы назначить префикс пространства имен для узла root, затем назначьте префикс всем детям с помощью createElement. Ниже показано с пятью пользователями Stackoverflow VBA :

Данные

Excel Table

VBA

Sub BuildXML()
On Error GoTo ErrHandle
    Dim dXMLDokument As MSXML2.DOMDocument60, dXmlsupernode As IXMLDOMElement 
    Dim subnode As IXMLDOMElement, valnode As IXMLDOMElement
    Dim i As Long, lastRow As Long

    Set dXMLDokument = New MSXML2.DOMDocument60

    With dXMLDokument
        .appendChild .createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")

        Set dXmlsupernode = .createNode(1, "lhd:supernode", "https://stackoverflow.com")
        .appendChild dXmlsupernode
    End With

    ' ROOT CHILDREN
    With ThisWorkbook.Worksheets("Data")
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = 2 To lastRow
            Set subnode = dXMLDokument.createElement("lhd:subnode")

            Set valnode = dXMLDokument.createElement("lhd:user")
            valnode.Text = .Cells(i, 1)
            subnode.appendChild valnode
            Set valnode = dXMLDokument.createElement("lhd:url")
            valnode.Text = .Cells(i, 2)
            subnode.appendChild valnode
            Set valnode = dXMLDokument.createElement("lhd:rep")
            valnode.Text = .Cells(i, 3)
            subnode.appendChild valnode
            Set valnode = dXMLDokument.createElement("lhd:tag1")
            valnode.Text = .Cells(i, 4)
            subnode.appendChild valnode
            Set valnode = dXMLDokument.createElement("lhd:tag2")
            valnode.Text = .Cells(i, 5)
            subnode.appendChild valnode
            Set valnode = dXMLDokument.createElement("lhd:tag3")
            valnode.Text = .Cells(i, 6)
            subnode.appendChild valnode

            dXmlsupernode.appendChild subnode
        Next i
    End With

    dXMLDokument.Save "C:\Path\To\Output.xml"

ExitHandler:
    Set valnode = Nothing: Set subnode = Nothing: 
    Set dXmlsupernode = Nothing: Set dXMLDokument = Nothing
    Exit Sub

ErrHandle:
    MsgBox Err.Number & " - " & Err.Description, vbCritical
    Resume ExitHandler
End Sub

XML (правильное, правильное XML)

<?xml version="1.0" encoding="UTF-8"?>
<lhd:supernode xmlns:lhd="https://stackoverflow.com">
    <lhd:subnode>
        <lhd:user>Siddharth Rout</lhd:user>
        <lhd:url>https://stackoverflow.com/users/1140579/siddharth-rout</lhd:url>
        <lhd:rep>125347</lhd:rep>
        <lhd:tag1>16</lhd:tag1>
        <lhd:tag2>165</lhd:tag2>
        <lhd:tag3>223</lhd:tag3>
    </lhd:subnode>
    <lhd:subnode>
        <lhd:user>Tim Williams</lhd:user>
        <lhd:url>https://stackoverflow.com/users/478884/tim-williams</lhd:url>
        <lhd:rep>101719</lhd:rep>
        <lhd:tag1>9</lhd:tag1>
        <lhd:tag2>74</lhd:tag2>
        <lhd:tag3>90</lhd:tag3>
    </lhd:subnode>
    <lhd:subnode>
        <lhd:user>Mathieu Guindon</lhd:user>
        <lhd:url>https://stackoverflow.com/users/1188513/mathieu-guindon</lhd:url>
        <lhd:rep>57421</lhd:rep>
        <lhd:tag1>8</lhd:tag1>
        <lhd:tag2>79</lhd:tag2>
        <lhd:tag3>183</lhd:tag3>
    </lhd:subnode>
    <lhd:subnode>
        <lhd:user>Gary's Student</lhd:user>
        <lhd:url>https://stackoverflow.com/users/2474656/garys-student</lhd:url>
        <lhd:rep>80335</lhd:rep>
        <lhd:tag1>9</lhd:tag1>
        <lhd:tag2>43</lhd:tag2>
        <lhd:tag3>69</lhd:tag3>
    </lhd:subnode>
    <lhd:subnode>
        <lhd:user>brettdj</lhd:user>
        <lhd:url>https://stackoverflow.com/users/641067/brettdj</lhd:url>
        <lhd:rep>50419</lhd:rep>
        <lhd:tag1>16</lhd:tag1>
        <lhd:tag2>102</lhd:tag2>
        <lhd:tag3>164</lhd:tag3>
    </lhd:subnode>
</lhd:supernode>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...