尝试根据属性值删除XML节点

时间:2016-01-08 12:37:00

标签: c# xml asp.net-mvc linq

我试图根据某些属性值从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);

我无法弄清楚这一点。任何帮助,不胜感激。谢谢

2 个答案:

答案 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与字符串类型进行比较