检查Linq中XML节点是否存在

时间:2011-08-04 20:47:50

标签: c# linq-to-xml

我在一个文件夹中循环访问了一系列XML文件。它们几乎总是相同,但我不时会遇到一个不包含其他元素所包含的元素的文件。例如,在一个文件中,它将如下所示:

<sb_sbgp>
  <itemtitle>French-Canadian</itemtitle>
  <itemtype>subscription</itemtype>
  <audience>French people</audience>
</sb_sbgp>

但下一个文件可能如下所示:

<sb_sbgp>
  <itemtitle>Spanish</itemtitle>
  <itemtype>subscription</itemtype>
</sb_sbgp>

我的问题是我不能只提取那些包含audience元素的文件(这将允许我添加where子句)。理想情况下,如果它不存在,我希望它默认为 null 。以下是我用来尝试完成此操作的查询:

XDocument doc = XDocument.Load(mydoc.xml);
var x = (from node in doc.Descendants("sb_sbgp")
         select new
         {
             title = node.Element("itemtitle").Value,
             type = node.Element("itemtype").Value,
             audience = string.IsNullOrEmpty(node.Element("sb_sbgp_audience").Value) ? node.Element("sb_sbgp_audience").Value : null
         });

我意识到正在测试是否有值,而不是元素,但我找不到任何可以让我测试元素存在的东西。帮助

4 个答案:

答案 0 :(得分:3)

尝试...

XDocument doc = XDocument.Load("");
var x = (from node in doc.Descendants("sb_sbgp")
     select new
     {
         title = node.Element("itemtitle").Value,
         type = node.Element("itemtype").Value,
         audience = (node.Element("sb_sbgp_audience") != null) ? node.Element("sb_sbgp_audience").Value : null
     });

答案 1 :(得分:3)

你很幸运 - 实际上很容易做到这一点:)

而不是使用.Value,只需cast to string和LINQ to XML即可实现您的目标:

audience = (string) node.Element("sb_sbgp_audience")

如果对任何可空类型(无论是引用类型还是可空值类型)转换为空XElementXAttribute引用,您将获得null结果。非常方便。

唯一的缺点是,如果有一个元素,你仍然会得到空字符串而不是空引用。如果你真的想避免这种情况,我建议你创建一个像这样的扩展方法:

public static string ToNullIfEmpty(this string text)
{
    return string.IsNullOrEmpty(text) ? null : text;
}

然后你可以使用:

audience = ((string) node.Element("sb_sbgp_audience")).ToNullIfEmpty()

答案 2 :(得分:1)

这个怎么样?

XDocument doc = XDocument.Load(mydoc.xml);
var x = (from node in doc.Descendants("sb_sbgp")
         select new
         {
             title = node.Element("itemtitle").Value,
             type = node.Element("itemtype").Value,
             audience = node.Element("audience") != null) ? node.Element("audience").Value : null
         });

答案 3 :(得分:1)

这个怎么样:

audience = node.Elements("sb_sbgp_audience").Count() > 0 ? node.Element("sb_sbgp_audience").Value : null