2009-10-30 57 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數字,我需要能夠刪除對該用戶的所有引用。

所以說,我有ID號碼3,我怎樣才能從xml文件中完全刪除用戶ID號碼3的存在?

我正在尋找代碼示例,但任何幫助將不勝感激!

回答

6

使用XML DOM(.NET 1.x及更高版本)的一種方法是隻加載文件,找到用戶編號。 3,並刪除節點,並將該文件保存回:

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 2009-10-30 08:54:28

+0

@AakashM - 謝謝你指出 - 你100%正確,但你的語法不太對 - 我相應地更新了我的文章。謝謝! – 2009-10-30 09:23:45

4

假設你有一個XDocument加載XML:

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及更高版本上運行 – 2009-10-30 06:00:32

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"); 
    } 
}