2014-02-05 82 views
0

我正面臨xpath問題,我必須複製子節點到父節點,如果檢查此條件:IdchildNode = IdparentNode。Xpath複製和刪除節點

我的代碼:

string IDchildnode = "1492"; 

string xpathNodeToCopy = "/a:SL/a:Data/a:ChildNode[@id=\"" + IDchildnode + "\"]"; 
nodeToClone = doc.SelectSingleNode(xpathNodeToCopy, xnsm); 

if (nodeToClone != null) 
{ 
    nodeToCopy = nodeToClone.Clone(); 

    string xpathNodePlaceToCopy = "/a:SL/a:Sub/a:VolLevel/a:Bay/*/a:ParentNode[@lid=\"" + IDchildnode + "\"]"; 

    XmlNodeList nodeList = doc.SelectNodes(xpathNodePlaceToCopy, xnsm); 

    if (nodeList != null) 
    { 
     for (int i = 0; i <= nodeList.Count; i++) 
     { 
      nodeList[i].AppendChild(nodeToCopy); 
      doc.Save(sourceFile); 
     } 
    } 
} 

,我不明白的現象發生,我把一個斷點在我的代碼和我並行檢查,如果我的XML文檔,我的列表中的每個元素都接收副本但:

第一個元素,孩子的副本完成了,我刷新了我的xml文檔,我看到孩子已被複制。 第二個元素,子元素也被複制,但是列表的第一個元素的子元素已被刪除。 第三個元素,該子項已被複制,但該列表的第二個元素的子項已被刪除。

等等

比如我在這裏的XML文檔的簡化圖,當迭代達到I = 1:

<ItemParent id="1492"></ItemParent> 
<ItemParent id="1492"> 
    <ItemChild id="1492"></ItemParent> 
<ItemParent id="1492"> 
<ItemParent id="1492"> 

這裏你可以看到,我的孩子已經被複制第一ItemParent已被刪除。

我不明白爲什麼在每次迭代't'中,刪除itérération't-1'中複製的子項。特別是當我在每次迭代時用「doc.Save(sourceFile)」保存我的xml文檔。

謝謝。

回答

0

這就是像AppendChild這樣的DOM方法是如何工作的,如果參數位於樹的某個位置,它就會被移動並且不被克隆。所以你必須確保你做

nodeList[i].AppendChild(nodeToCopy.Clone()); 

確保爲您的節點列表中的每個項目插入一個新的副本。

+0

謝謝Martin,你的答案現在可以正常工作! – AlexDG