我面临的情况是使用 Linq 将 XML 文档解析为对象。在解析期间,我正在检查以确保元素在继续解析它们的值之前不为空。无论如何要简化这个陈述?
var variable = (from x in xdoc.Descendants("Root")
select new AccountingResponse
{
NetCharge = x.Element("Charges") != null && x.Element("Charges").Element("NetCharge") != null ? x.Element("Charges").Element("NetCharge").Value : "0",
TotalCharge = x.Element("Charges") != null && x.Element("Charges").Element("TotalCharge") != null ? x.Element("Charges").Element("TotalCharge").Value : "0"
}).SingleOrDefault();
总而言之,我不想继续检查每一行上是否存在节点。我知道我可以在解析之前测试节点是否存在,但可能还有其他数据需要解析才能创建 AccountingResponse,我想避免 if 语句一次只解析一部分 XML。
也许我做的完全错了,还有更好的方法!
最佳答案
一个简单的选择是使用 Elements
而不是 Element
- 如果元素不存在,它将返回一个零长度序列。所以你可以使用:
from x in xdoc.Descendants("Root")
select new AccountingResponse
{
NetCharge = x.Elements("Charges")
.Elements("NetCharge")
.Select(y => (int) y)
.FirstOrDefault(),
TotalCharge = x.Elements("Charges")
.Elements("TotalCharge")
.Select(y => (int) y)
.FirstOrDefault(),
}).SingleOrDefault();
(请注意,您的原始代码无法编译,因为 Value
是一个字符串,而 0 是一个 int...)
关于c# - 带有检查空元素的 XML 到 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15837829/