2014-07-22 2 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

안된 시도 :

당신은 노드의 부모 노드를 제거 할 수와 그 부모 노드에서 .RemoveChild()를 호출 할 필요가
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

이 때문에 당신의 XML은 ListsListName라는 이름의이 아이 노드가 포함이

Lists[contains(ListName,'ws_Users')] 

이다. contains() 함수의 첫 번째 인수는 단일 항목 만 포함해야합니다. 변경 것과 :

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

답장을 보내 주셔서 감사하지만 동일한 오류가 발생합니다 –

+0

이 링크 (http://www.xpathtester.com/xpath/8ba0a0c1e4ee300d77e189e78b4a7899)를 참조하십시오. 삭제할 노드를 올바르게 선택합니다. –

+0

위의 문장으로는 아무것도 볼 수 없다는 것을 알 수있다. –

0

: 어쩌면

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[IId='2']/Lists/ListName[contains(.,'ws_Users') ]' – har07