【问题标题】:Remove element from XML based on attribute value?根据属性值从 XML 中删除元素?
【发布时间】:2012-01-16 18:04:16
【问题描述】:

我试图从 XElement 中删除后代元素(使用 .Remove()),我似乎得到了一个空对象引用,但我不知道为什么。

看了上一个标题为(see here)的问题,我找到了删除它的方法,但我仍然不明白为什么我尝试第一个的方法不起作用.

有人可以启发我吗?

  String xml = "<things>"
             + "<type t='a'>"
             + "<thing id='100'/>"
             + "<thing id='200'/>"
             + "<thing id='300'/>"
             + "</type>"
             + "</things>";

  XElement bob = XElement.Parse(xml);

  // this doesn't work...
  var qry = from element in bob.Descendants()
            where element.Attribute("id").Value == "200"
            select element;
  if (qry.Count() > 0)
     qry.First().Remove();

  // ...but this does
  bob.XPathSelectElement("//thing[@id = '200']").Remove();

谢谢, 罗斯

【问题讨论】:

    标签: c# linq-to-xml xelement


    【解决方案1】:

    问题是您正在迭代的集合包含一些没有id 属性的元素。对于他们来说,element.Attribute("id")null,因此尝试访问Value 属性会抛出NullReferenceException

    解决此问题的一种方法是使用a cast 而不是Value

    var qry = from element in bob.Descendants()
              where (string)element.Attribute("id") == "200"
              select element;
    

    如果一个元素没有id 属性,则转换将返回null,这在这里可以正常工作。

    如果您要进行投射,也可以投射到int?,如果您愿意的话。

    【讨论】:

    • 谢谢 svick,我知道现在是什么问题了。
    【解决方案2】:

    尝试以下方法:

      var qry = bob.Descendants()
                   .Where(el => el .Attribute("id") != null)
                   .Where(el => el .Attribute("id").Value = "200")
    
      if (qry.Count() > 0)
         qry.First().Remove();
    

    在获取其值之前,您需要测试 id 属性是否存在。

    【讨论】:

    • 感谢您提供有用的建议。检查属性 - 根据 svick 的回答,我明白为什么它是相关的。
    • @BlackLight 哦,不错,值得一试!
    • 好吧,没有冒犯,但是已经三年多了,我真的很惊讶没有人看到这段代码中有任何错误。有3个非常明显的错误。 el .Attribute 两次都有空格,Attribute("id").Value = "200" 应该是 Attribute("id").Value == "200"。注意双 = 符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多