c# - 带有检查空元素的 XML 到 LINQ

标签 c# linq xml-parsing

我面临的情况是使用 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/

相关文章:

c# - 如何使用 Xamarin 将 "Entry Cell"绑定(bind)到自定义对象?

c# - Linq:前瞻性条件

java - 我可以在 Java 中解析 XML,而不需要从外部获取 XML 文件输入吗?

c# - 从字符串中分离值

c# - 第一个 html 帮助程序生成客户端验证属性,而第二个则不

c# - 在 C# 的文件夹中查找最新创建的文件的好方法是什么?

android - android中的解析器

xml - 如何使用 XML::LibXML::Reader 获取属性名称列表?

c# - 找不到资源组下的 Azure 媒体服务资源

c# - CosmosDb LINQ 查询 'any' 不起作用,但 'count() > 0' 起作用?