2014-07-07 102 views
0

追加孩子節點別處以下VBA代碼需要一個XML文件,並附加在文檔中的特定節點到其他節點:在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被接受爲有效,還是我應該以不同的方式接近?

回答

1

Node.ParentNode.ParentNode將返回一個節點,而不是一個集合,所以你不需要內For Each循環:

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

感謝蒂姆,這解決了錯誤,但由於某種原因,實際並沒有任何附加給文檔與替代。 – 114

+0

創建一個變量,您可以爲其分配'Node.ParentNode.ParentNode',然後添加一個Watch並做一些調試 - 您期望的是什麼?如果沒有示例XML,很難確切地說出發生了什麼。 –

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