我试图根据某些属性值从XML中删除一条记录。我的XML结构如下:
<?xml version="1.0" encoding="utf-8"?>
<Users>
<User>
<UserId>12345</UserId>
<FirstName>abcd</FirstName>
<LastName>efgh</LastName>
<Email>Hello@hello.com</Email>
<IsAdmin>No</IsAdmin>
</User>
<User>
<UserId>67890</UserId>
<FirstName>ijklm</FirstName>
<LastName>nopqr</LastName>
<Email>world@world.com</Email>
<IsAdmin>No</IsAdmin>
</User>
<User>
<UserId>12678</UserId>
<FirstName>stuv</FirstName>
<LastName>wxyz</LastName>
<Email>foo@bar.com</Email>
<IsAdmin>Yes</IsAdmin>
</User>
</Users>
例如,如果属性值为12345,则应从XML中删除以下记录。
<User>
<UserId>12345</UserId>
<FirstName>abcd</FirstName>
<LastName>efgh</LastName>
<Email>Hello@hello.com</Email>
<IsAdmin>No</IsAdmin>
</User>
我尝试了以下代码,但我无法从XML中删除任何内容。
string path = Server.MapPath("~/XML/users.xml");
XElement xEle = XElement.Load(path);
var qry = from element in xEle.Descendants()
where (string)element.Attribute("UserId").Value == "12345"
select element;
if (qry.Count() > 0)
qry.First().Remove();
xEle.Save(path);
我无法弄清楚这一点。任何帮助,不胜感激。谢谢
答案 0 :(得分:1)
<UserId>12345</UserId>
是<User>
的嵌套子元素,而不是属性。请参阅XML attribute vs XML element以了解其中的差异。
因此你需要这样做:
var userId = "12345";
var qry = from element in xEle.Descendants("User")
where (string)element.Element("UserId") == userId
select element;
var first = qry.FirstOrDefault();
if (first != null)
first.Remove();
顺便提一下,通过同时调用Count()
和First()
,您将对您的查询进行两次评估。 FirstOrDefault()
返回第一个匹配元素,如果枚举为空,则返回null
,因此效率更高。
答案 1 :(得分:1)
UserId不是XML中的属性。它是一个元素
XElement xEle = XElement.Load("input.xml");
var qry = from element in xEle.Descendants()
where (string)element.Element("UserId") == "12345"
select element;
if (qry.Count() > 0)
qry.First().Remove();
xEle.Save("input.xml");
在你的代码片段中,你将12345 int与字符串类型进行比较