繁体   English   中英

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

[英]Trying to delete an XML Node based on attribute value

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

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

<UserId>12345</UserId><User>的嵌套子元素,而不是属性。 请参阅XML属性与XML元素以了解区别。

因此,您需要执行以下操作:

        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 ,因此效率更高。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM