C# 将XML文档转换为对象列表的LINQ查询导致异常
我有一个相当大的LINQ查询,它将XML节点读入对象属性,但是查询中的一行导致System.FormatException异常,该异常基于“输入字符串格式不正确” (double)e.Element(“TotalPrice”)//行中的此文本由调试器突出显示,因此此元素必须是原因 XML文档中有1000条记录,因此我很难找到导致异常的记录,有没有办法将导致错误的值“抛出”到catch()语句中?我不确定如何调试LINQ查询以在运行时获取值,我确定这只是一个问题,对于这个特定记录,XML节点是空的。(或包含非法字符)C# 将XML文档转换为对象列表的LINQ查询导致异常,c#,xml,linq,C#,Xml,Linq,我有一个相当大的LINQ查询,它将XML节点读入对象属性,但是查询中的一行导致System.FormatException异常,该异常基于“输入字符串格式不正确” (double)e.Element(“TotalPrice”)//行中的此文本由调试器突出显示,因此此元素必须是原因 XML文档中有1000条记录,因此我很难找到导致异常的记录,有没有办法将导致错误的值“抛出”到catch()语句中?我不确定如何调试LINQ查询以在运行时获取值,我确定这只是一个问题,对于这个特定记录,XML节点是空的
我知道这是一个特定的记录,因为我可以毫无问题地提取许多行,但是当我尝试提取一个特定的子集时,我得到了异常,因此我知道它被本地化为一个月的数据,但我无法进一步缩小它的范围。您可以向select表达式添加一个try catch语句,类似这样:
var DeliveryFee = x.Descendants("LineItemShipping").
Select(e => {
try
{
var item = (double)e.Element("TotalPrice");
return item;
}
catch(Exception ex)
{
//This is just so it will compile and have a return value
return double.MinValue;
}
}).
FirstOrDefault();
要查找此错误,请首先通过
Debug
->异常启用。在所有异常上启用中断,或在System.FormatException
上启用中断
现在,当为LineItemShipping
节点引发异常且TotalPrice
无效时,Visual Studio将停止。然后,在中,您可以使用该方法通过键入以下内容来查找有问题的节点:
e.Element("SomeStatus").AncestorsAndSelf().ToArray()
Visual Studio将向您显示生成异常的XElement
的路径。这将允许您找到有问题的XML节点。尝试将(double)
更改为(double?
以处理空案例和??0
要将空值转换为零:
(double)(x.Descendants("LineItemShipping")
.Select(e => (double?)e.Element("TotalPrice")).FirstOrDefault())
?? 0)
您可以只运行DeliveryFee=x.subjects(“LineItemShipping”)。其中(e=>(double?)e.Element(“TotalPrice”)==null)。FirstOrDefault(),
请提供示例XML。这有助于我跟踪导致问题的记录。谢谢你的帮助!
(double)(x.Descendants("LineItemShipping")
.Select(e => (double?)e.Element("TotalPrice")).FirstOrDefault())
?? 0)