使用XDocument判断元素是否存在具有特定属性的?

时间:2014-08-21 14:16:18

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

我尝试使用LINQ和XDocument根据特定条件从XML文档中删除条目:

xml.Descendants("Photos").Where(e => e.Attribute("File").Value.Equals(ID)).Remove();

但是,如果找不到条目,​​则会抛出 NullReferenceException 错误。我试图计算所有匹配的元素,但不幸的是我得到了同样的错误:

public void Delete(string ID)
{
    XDocument xml = XDocument.Load(xmlPath);

    var count = xml.Descendants("Photos").Where(e => e.Attribute("File").Value.Equals(ID)).Count();

    if (count >= 1)
    {
        xml.Descendants("Photos").Where(e => e.Attribute("File").Value.Equals(ID)).Remove();
    }
}

但是这次它会在xml...Count()行返回错误。

有关如何找出匹配元素的建议吗?

谢谢

2 个答案:

答案 0 :(得分:3)

问题在于:

e.Attribute("File").Value.Equals(ID)

如果此属性不存在,您将获得NullReferenceException。相反,您可以使用explicit conversion operator来获益:

var count = xml.Descendants("Photos")
               .Where(e => (string) e.Attribute("File") == ID)
               .Count();

但这部分并不是真的需要,所以只需直接删除这些项目:

xml.Descendants("Photos")
   .Where(e => (string) e.Attribute("File") == ID)
   .Remove();

答案 1 :(得分:2)

请勿使用Value属性。使用显式强制转换并使用==

检查属性的值
.Where(e => (string) e.Attribute("File") == ID)

如果找不到Attribute,则不会抛出异常,而是会返回null