2014-07-22 115 views
0

任何人都可以解釋爲什麼我無法使用此查詢刪除此子節點。它給了我一個錯誤,說「在System.Xml.dll中發生了'System.ArgumentException'類型的未處理異常。附加信息:要刪除的節點不是此節點的子節點。在xml文件中刪除具有特定值的子節點

 XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load("sample.xml"); 
     xDoc.RemoveChild(xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists[contains(ListName,'ws_Users')]")); 
     xDoc.Save("sample.xml"); 

的xml文件:

<?xml version="1.0" encoding="utf-8"?> 
    <Root> 
     <Class Name="ECMInstruction" Style="Top"> 
     <Entity Id="1" Name="DocumentInformation" /> 
     <Property Id="1"> 
     </Property> 
     <Property Id="2"> 
      <Lists> 
      <ListName>ws_Users</ListName> 
      <ListName>dfdfdfd</ListName> 
      </Lists> 
     </Property> 
     </Class> 
    </Root> 
+1

也許你需要直接在節點上調用RemoveChild,你試圖刪除的是孩子的?不在根節點上? – Davio

回答

0

一個未經測試的嘗試:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("sample.xml"); 
var parent = xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists"); 
var nodeToRemove = parent.SelectSingleNode("ListName[text() = 'ws_Users')]"); 
parent.RemoveChild(nodeToRemove); 
xDoc.Save("sample.xml"); 
+0

你的工作是通過專門選擇含有ws_Users的文本並從語句中刪除父項來實現的。謝謝 –

0

正是因爲這個

Lists[contains(ListName,'ws_Users')] 

你的XML包含2個命名的ListsListName子節點。 contains()函數的第一個參數應該只包含一個項目。修改成:

Lists[ListName[contains(.,'ws_Users')]] 
+0

感謝您的回答,但它給出了相同的錯誤 –

+0

請參閱此鏈接(http://www.xpathtester.com/xpath/8ba0a0c1e4ee300d77e189e78b4a7899)。它正確選擇您要刪除的節點。 –

+0

我可以看到,但與我的上述聲明它不會什麼都不做 –

0

你需要得到要刪除的節點的父節點,並從該父節點調用.RemoveChild()

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("sample.xml"); 
var nodeTobeRemoved = xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists/ListName[contains(.,'ws_Users')]"); 
nodeTobeRemoved.ParentNode.RemoveChild(nodeTobeRemoved); 
xDoc.Save("sample.xml"); 
+0

我試過你的問題,但問題是它刪除了listname及其列表的父節點。所以所有的列表都被刪除了,我不希望那樣。 –

+0

如果這就是你想要的,那麼XPath應該是這樣的:''//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists/ListName[contains(.,'ws_Users') ]' – har07

相關問題