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

C# 删除我的XML文件的整个部分,c#,xml,C#,Xml,我有一个我正在设计的程序的用户列表,所有用户都存储在一个XML文件中,如下所示: <?xml version="1.0"?> <Users> <User ID="1"> <nickname>Tom</nickname> <password>Sams</password> <host>ahost@asd.com</host> <email>ba

我有一个我正在设计的程序的用户列表,所有用户都存储在一个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>

汤姆
萨姆
ahost@asd.com
badrandom@as.com
真的
10
ohai
asdalkdj9u
meh@meh.com
my@email
假的
1.
ohai
塞克雷特
my@host
my@email
假的
1.
mib_hr6qhr
YXNsa2RhZGxrYXNk
adb7e51b@webchat.mibbit.com
alskd@alskd.com
真的
1.
现在,根据用户ID号,我需要能够删除对该用户的所有引用

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


我正在寻找代码示例,但任何帮助都将不胜感激

使用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");

Marc

假设您已将XML加载到
XDocument

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

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

当然,这假设您请求的用户始终存在于XML中。为了安全起见,您应该使用
SingleOrDefault()
,并在删除之前检查
null
值。

linq和DOM方法的问题是存在一个有效的往返(解析/序列化),vtd xml有一个称为增量更新的东西,下面是一篇解释它的文章


doc.RemoveChild(userNo3)
-只有当
userNo3
是顶级节点时,这难道不起作用吗?你真的不需要
userNo3.Parent.RemoveChild(userNo3)
?@AakashM-谢谢你指出这一点-你100%正确,但你的语法不太正确-我相应地更新了我的帖子。谢谢
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");
    }
}