c# – Linq到Xml – 空元素

c# – Linq到Xml – 空元素,第1张

概述我正在使用 Linq解析xml文档,但我遇到的情况是我不知道如何处理这个问题.我发现/尝试过的所有东西似乎都不起作用.正如您在下面看到的(非常简单的场景)OrderAmount为空.这是一个十进制字段.当我试图在LINQ中处理它时,它一直在轰炸.我尝试过使用deimcal ?,使用null检查等,似乎没有任何工作(很可能是用户错误).任何建议,将不胜感激. 当元素是非字符串(如十进制)并且为空时, 我正在使用 Linq解析xml文档,但我遇到的情况是我不知道如何处理这个问题.我发现/尝试过的所有东西似乎都不起作用.正如您在下面看到的(非常简单的场景)OrderAmount为空.这是一个十进制字段.当我试图在liNQ中处理它时,它一直在轰炸.我尝试过使用deimcal ?,使用null检查等,似乎没有任何工作(很可能是用户错误).任何建议,将不胜感激.

当元素是非字符串(如十进制)并且为空时,如何处理?

XML:

<Orders>  <Order>    <OrderNumber>12345</OrderNumber>    <OrderAmount/>  </Order></Orders>

liNQ:

List<Order> myOrders = from orders in xdoc.Descendants("Order")                       select new Order{                       OrderNumber = (int)orders.Element("OrderNumber"),OrderAmount = (decimal?)orders.Element("OrderAmount"),}.ToList<Order>();
解决方法 将XElement转换为十进制?仅当元素实际为null时才返回null.

我认为最可读的解决方案是这样的:

elem.IsEmpty ? null : (decimal?)elem

如果经常使用它,您可能希望将其放入扩展方法中.或者只是在liNQ查询中使用let来不重复选择元素的代码.

from orders in xdoc.Descendants("Order")let amountElem = orders.Element("OrderAmount")select new Order{    OrderNumber = (int)orders.Element("OrderNumber"),OrderAmount = amountElem.IsEmpty ? null : (decimal?)amountElem}

如果可以更改XML,另一个选项就是省略要表示null的元素.它应该与您已有的代码一起使用.

编辑:扩展方法看起来像这样:

static class XElementExtensions{    public static decimal? ToNullableDecimal(this XElement elem)    {        return elem.IsEmpty ? null : (decimal?)elem;    }}

你会像这样使用它:

OrderAmount = orders.Element("OrderAmount").ToNullableDecimal()
总结

以上是内存溢出为你收集整理的c# – Linq到Xml – 空元素全部内容,希望文章能够帮你解决c# – Linq到Xml – 空元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存