2012-06-19 148 views
2

我有兩個XmlDocuments,它們都具有指定的名稱空間屬性。兩份文件都有相同的結構,但包含不同的數據。我似乎無法從一個文檔中獲取特定節點樹,並將其添加到第二個文檔中同一個節點樹的末尾。這裏是我的兩個文件的例子:將XML節點添加到XmlDocument中的特定節點

文件#1:

<?xml version="1.0"?> 
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18"> 
    <node0> 
    </node0> 
    <node1> 
     <Item> 
      <Id>1</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>2</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>3</Id> 
      .... 
     </Item> 
    </node1> 
</rootnode> 

文檔#2

<?xml version="1.0"?> 
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18"> 
    <node0> 
    </node0> 
    <node1> 
     <Item> 
      <Id>4</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>5</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>6</Id> 
      .... 
     </Item> 
    </node1> 
</rootnode> 

我希望實現什麼目標:

<?xml version="1.0"?> 
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18"> 
    <node0> 
    </node0> 
    <node1> 
     <Item> 
      <Id>1</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>2</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>3</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>4</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>5</Id> 
      .... 
     </Item> 
     <Item> 
      <Id>6</Id> 
      .... 
     </Item> 
    </node1> 
</rootnode> 

我試圖將所有<Item>節點從一個文檔添加到另一個文檔,同時保持所有其他節點的結構。任何一個文檔中都有任意數量的<Item>節點。每個<Item>節點都有深度嵌套的描述該項目的節點數量。

Dim dstdoc As XmlDocument = myobject1.XmlDocument 
Dim srcdoc As XmlDocument = myobject2.XmlDocument 

Dim nsmgr As New XmlNamespaceManager(New NameTable) 
nsmgr.AddNamespace("ns", "http://www.mynamespace.com/Service/2012-06-18") 

Dim xpath As String = "ns:rootnode/ns:node1//ns:Item" 

Dim copiedNode As XmlNode = dstdoc.ImportNode(_ 
          srcdoc.SelectSingleNode(xpath, nsmgr), True) 
dstdoc.DocumentElement().AppendChild(copiedNode) 

我當然知道這是錯誤的......我嘗試了幾種不同的方法。這種特殊的方法將所有<Item>節點添加到目標文檔,但它將它們添加到文檔的最底部,而不是在最後的<Item>之後。

有人請告訴我如何將XmlDocument的特定節點樹添加到另一個文檔中的特定位置?同樣,涉及到一個名稱空間,並且每個節點下都有嵌套的節點/元素。

注意:<Id>節點有示例數據僅顯示唯一性。我永遠不會指望任何一種編號。每個<Item>節點的順序完全不重要。我只是假設在目標文檔的最後一個節點之後添加額外的<Item>節點將是最容易的。

回答

2

你很近。此行是不正確的:

dstdoc.DocumentElement().AppendChild(copiedNode) 

這就是明確說明您要附加到「文檔元素」(即根元素)。如果您要附加到目標文檔中特定的元素,你首先必須得到該目標元素的引用:

Dim destElement As XmlNode = dstdoc.SelectSingleNode("ns:rootnode/ns:node1", nsmgr) 
For Each sourceNode in srcdoc.SelectNodes(xpath, nsmgr) 
    Dim imported As XmlNode = dstdoc.ImportNode(sourceNode, True) 
    destElement.AppendChild(imported) 
Next 
+0

的FOR/NEXT循環中,我得到「要插入的節點來自不同的文檔上下文。「當'destElement.AppendChild(導入)'被執行時。我可以通過你的代碼看到你讓我走在正確的軌道上。我明白我現在做錯了什麼。你能理解這個錯誤嗎?謝謝!! – rwkiii

+0

對不起雅各布,你的代碼工作。問題在我身上。嘿,再次感謝你。 – rwkiii