以下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
被接受为有效,或者我应该以不同的方式接近这个?
答案 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