【问题标题】:Trying to delete an XML Node based on attribute value尝试根据属性值删除 XML 节点
【发布时间】:2016-01-08 12:36:59
【问题描述】:

我正在尝试根据某个属性值从 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);

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

【问题讨论】:

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


【解决方案1】:

&lt;UserId&gt;12345&lt;/UserId&gt;&lt;User&gt; 的嵌套子元素,而不是属性。请参阅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,因此效率更高。

【讨论】:

  • 非常感谢您的帮助。真的很感激这一点。现在工作得很好:)
  • 或者,您可以使用qry.Take(1).Remove() 删除第一个匹配项。
【解决方案2】:

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

在您的 sn-p 中,您将 12345 int 与字符串类型进行比较

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多