我在一个文件夹中循环访问了一系列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
});
我意识到正在测试是否有值,而不是元素,但我找不到任何可以让我测试元素存在的东西。帮助
答案 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")
如果对任何可空类型(无论是引用类型还是可空值类型)转换为空XElement
或XAttribute
引用,您将获得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