我有一个我正在设计的程序的用户列表,所有用户都存储在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的存在?
我正在寻找代码示例,但是非常感谢任何帮助!
答案 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
:
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");
}
}