根据属性值从XML中删除元素?

时间:2012-01-16 09:53:12

标签: c# linq-to-xml xelement

我试图从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();

谢谢, 罗斯

2 个答案:

答案 0 :(得分:3)

问题是您正在迭代的集合包含一些没有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?

答案 1 :(得分:1)

尝试以下方法:

  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属性是否存在。