2009-10-30 5 views
0

내 XML 파일의 전체 부분을 삭제하고 모든 사용자는 XML 파일로 저장됩니다내가 설계 해요 프로그램에 대한 사용자 목록을

<?xml version="1.0"?> 
<Users> 
    <User ID="1"> 
    <nickname>Tom</nickname> 
    <password>Sams</password> 
    <host>[email protected]</host> 
    <email>[email protected]</email> 
    <isloggedin>true</isloggedin> 
    <permission>10</permission> 
    </User> 
    <User ID="2"> 
    <nickname>ohai</nickname> 
    <password>asdalkdj9u</password> 
    <host>[email protected]</host> 
    <email>[email protected]</email> 
    <isloggedin>false</isloggedin> 
    <permission>1</permission> 
    </User> 
    <User ID="3"> 
    <nickname>ohai</nickname> 
    <password>sercret</password> 
    <host>[email protected]</host> 
    <email>[email protected]</email> 
    <isloggedin>false</isloggedin> 
    <permission>1</permission> 
    </User> 
    <User ID="4"> 
    <nickname>mib_hr6qhr</nickname> 
    <password>YXNsa2RhZGxrYXNk</password> 
    <host>[email protected]</host> 
    <email>[email protected]</email> 
    <isloggedin>true</isloggedin> 
    <permission>1</permission> 
    </User> 
</Users> 

이제 ID 사용자를 기반으로 번호, 해당 사용자에 대한 모든 참조를 삭제할 수 있어야합니다.

그래서 나는 완전히 XML 파일에서 사용자 ID 번호 3의 존재를 삭제하는 방법을, 나는 ID 번호 3이, 말?

나는 코드 예제를 찾고 있어요,하지만 어떤 도움을 주시면 감사하겠습니다!

답변

6

XML DOM (.NET 1.x 이상)을 사용하는 한 가지 방법은 파일을로드하고 사용자 번호를 찾는 것입니다. 3, 해당 노드를 제거하고 다시 파일 저장 : 당신이 XDocument에로드 된 XML이 가정

XmlDocument doc = new XmlDocument(); 
doc.Load("yourXmlFile.xml"); 

XmlNode userNo3 = doc.SelectSingleNode("//Users/User[@ID='3']"); 

if(userNo3 != null) 
{ 
    userNo3.ParentNode.RemoveChild(userNo3); 
} 

doc.Save("YourNewXmlFile.xml"); 

마크

+0

'doc.RemoveChild (userNo3)'- 'userNo3'이 최상위 노드 인 경우에만 작동하지 않습니까? 실제로'userNo3.Parent.RemoveChild (userNo3)'가 필요하지 않습니까? – AakashM

+0

@AakashM - 지적 해 주셔서 고맙습니다. 당신은 100 % 맞지만 문법이 옳지 않습니다. 그에 따라 내 게시물을 업데이트했습니다. 감사! –

4

을 : 물론

using System.Linq; 
using System.Xml.Linq; 

void Delete() 
{ 
    XDocument document = LoadXML(); 
    document.Elements("Users") 
     .Single(e => e.Attribute("ID").Value == "3") 
     .Remove(); 
} 

를,이 사용자한다고 가정 당신은 항상 XML에 요청할 것입니다. 안전을 위해 삭제하기 전에 SingelOrDefault()을 사용하고 null 값을 확인해야합니다.

+0

Linq-to-XML - 작동하지만 .NET 3.5 이상에서만 가능합니다. –

0

LINQ와 DOM 접근 방식의 문제는, VTD-XML은 뭔가 ... http://www.codeproject.com/KB/XML/xml_processing_future.aspx

여기를 설명하는 문서입니다, 증분 업데이트 요구했다 효율적으로 할 수있는 왕복 (구문 분석/직렬화) 있다는 것입니다
VTDGen vg = new VTDGen(); 
if (vg.parseFile("your.xml", false)){ 
    VTDNav vn = vg.getNav(); 
    AutoPilot ap = new AutoPilot(vn); 
    ap.selectXPath("https://stackoverflow.com/users/user[@ID='3']"); 
    XMLModifier xm = new XMLModifier(vn); 
    if (ap.evalXPath()!=-1){ 
     xm.remove(); 
     xm.output("new.xml"); 
    } 
} 
관련 문제