Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML文档转换为对象列表的LINQ查询导致异常_C#_Xml_Linq - Fatal编程技术网

C# 将XML文档转换为对象列表的LINQ查询导致异常

C# 将XML文档转换为对象列表的LINQ查询导致异常,c#,xml,linq,C#,Xml,Linq,我有一个相当大的LINQ查询,它将XML节点读入对象属性,但是查询中的一行导致System.FormatException异常,该异常基于“输入字符串格式不正确” (double)e.Element(“TotalPrice”)//行中的此文本由调试器突出显示,因此此元素必须是原因 XML文档中有1000条记录,因此我很难找到导致异常的记录,有没有办法将导致错误的值“抛出”到catch()语句中?我不确定如何调试LINQ查询以在运行时获取值,我确定这只是一个问题,对于这个特定记录,XML节点是空的

我有一个相当大的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)