将子项附加到XML文档中的其他节点

时间:2014-07-07 21:07:18

标签: xml vba

以下VBA代码采用XML文件并将特定节点附加到文档中的其他节点:

Dim xmlFilePath$, newFilePath$
Dim DOM As MSXML2.DOMDocument
Dim Node As IXMLDOMNode
Dim fso As Scripting.FileSystemObject
Dim itm As IXMLDOMNode

xmlfilepath = "Path"

newfilepath = "Path_2"

Set DOM = CreateObject("MSXML2.DOMDocument.6.0")

DOM.Load xmlFilePath

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.NextSibling.ChildNodes
            itm.appendChild Node.CloneNode(True)
    Next
Next

Set fso = CreateObject("Scripting.FileSystemObject")

Set DOM = Nothing
Set fso = Nothing
Set Node = Nothing

End Sub

这段代码完全没问题。但是,如果循环

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.NextSibling.ChildNodes
            itm.appendChild Node.CloneNode(True)
    Next
Next

更改为

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.ParentNode
            itm.appendChild Node.CloneNode(True)
    Next
Next

我收到“需要对象”错误。如果我改为使用Node.ParentNode.ParentNode.ChildNodes我没有收到任何错误,但是我尝试追加的节点被放置在一个已经存在的子节点中,因此结果类似于<a>Example<b>More_Writing</b></a>

有没有办法让路径Node.ParentNode.ParentNode被接受为有效,或者我应该以不同的方式接近这个?

2 个答案:

答案 0 :(得分:1)

Node.ParentNode.ParentNode将返回单个节点,而不是集合,因此您不需要内部For Each循环:

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   Node.ParentNode.ParentNode.appendChild Node.CloneNode(True)
Next

答案 1 :(得分:0)

蒂姆·威廉姆斯提供的代码工作正常。要解决XML未更新的问题,您需要像打开XML一样保存XML

'Open XML
DOM.Load xmlFilePath

'Edit XML
For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
    Node.ParentNode.ParentNode.appendChild Node.CloneNode(True)
Next

'Save XML
Dom.Save xmlFilePath