我试图从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();
谢谢, 罗斯
答案 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
属性是否存在。