删除我的XML文件的整个部分

时间:2009-10-30 05:54:00

标签: c# xml

我有一个我正在设计的程序的用户列表,所有用户都存储在XML文件中,如下所示:

<?xml version="1.0"?>
<Users>
  <User ID="1">
    <nickname>Tom</nickname>
    <password>Sams</password>
    <host>ahost@asd.com</host>
    <email>badrandom@as.com</email>
    <isloggedin>true</isloggedin>
    <permission>10</permission>
  </User>
  <User ID="2">
    <nickname>ohai</nickname>
    <password>asdalkdj9u</password>
    <host>meh@meh.com</host>
    <email>my@email</email>
    <isloggedin>false</isloggedin>
    <permission>1</permission>
  </User>
  <User ID="3">
    <nickname>ohai</nickname>
    <password>sercret</password>
    <host>my@host</host>
    <email>my@email</email>
    <isloggedin>false</isloggedin>
    <permission>1</permission>
  </User>
  <User ID="4">
    <nickname>mib_hr6qhr</nickname>
    <password>YXNsa2RhZGxrYXNk</password>
    <host>adb7e51b@webchat.mibbit.com</host>
    <email>alskd@alskd.com</email>
    <isloggedin>true</isloggedin>
    <permission>1</permission>
  </User>
</Users>

现在,根据用户ID号,我需要能够删除对该用户的所有引用。

所以说,我有ID号3,如何从xml文件中完全删除用户号3的存在?

我正在寻找代码示例,但是非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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");

马克

答案 1 :(得分: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值。

答案 2 :(得分:0)

linq和DOM方法的问题在于有一个往返(解析/序列化)可以有效,vtd-xml有一个叫做增量更新的东西,这里有一篇解释它的文章...... {{3 }}

VTDGen vg = new VTDGen();
if (vg.parseFile("your.xml", false)){
    VTDNav vn = vg.getNav();
    AutoPilot ap = new AutoPilot(vn);
    ap.selectXPath("/users/user[@ID='3']");
    XMLModifier xm = new XMLModifier(vn);
    if (ap.evalXPath()!=-1){
       xm.remove();
       xm.output("new.xml");
    }
}