C# 为什么LINQ找不到下两层的元素?
我在解析XML文件时遇到了问题(下面代码片段中的XML示例)。我得到的错误是 XmlToLink.exe中发生“System.NullReferenceException”类型的未处理异常 其他信息:对象引用未设置为对象的实例。 我知道我的问题出在XmlBarcodes=el.Element(“条形码”)区域,因为当我注释该部分时,会返回订单号、名字和姓氏以及产品名称。我认为这是因为我没有使用LINQ正确地深入到条形码字符串,但我已经尝试了各种方法来获取我能想到的元素,所以我想知道语法是否有其他问题(对我来说不明显)。我做错了什么C# 为什么LINQ找不到下两层的元素?,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我在解析XML文件时遇到了问题(下面代码片段中的XML示例)。我得到的错误是 XmlToLink.exe中发生“System.NullReferenceException”类型的未处理异常 其他信息:对象引用未设置为对象的实例。 我知道我的问题出在XmlBarcodes=el.Element(“条形码”)区域,因为当我注释该部分时,会返回订单号、名字和姓氏以及产品名称。我认为这是因为我没有使用LINQ正确地深入到条形码字符串,但我已经尝试了各种方法来获取我能想到的元素,所以我想知道语法是否有其他
private static IEnumerable<XmlOrders> ParseXml()
{
XDocument document = XDocument.Parse(GetXml());
var query = from el in document.Root.Elements("Order")
select new XmlOrders
{
Id = (int)el.Element("Id"),
XmlBillingAddress = new XmlBillingAddress()
{
FirstName = (string)el.Element("BillingAddress").Element("FirstName"),
LastName = (string)el.Element("BillingAddress").Element("LastName"),
},
XmlOrderItems = el.Element("OrderItems")
.Elements("OrderItem")
.Select(orderItem => new XmlOrderItems()
{
ProductName = (string)orderItem.Element("ProductName")
}).ToList(),
//XmlBarcodes = el.Element("OrderItems").Element("OrderItem").Element("Barcodes")
XmlBarcodes = el.Element("Barcodes")
.Elements("Barcode")
.Select(barcode => new XmlBarcodes()
{
BarcodeNumber = (string)barcode.Element("CodeString")
}).ToList()
};
return query;
}
private static String GetXml()
{
return @"<ArrayOfOrder>
<Order>
<Id>25057</Id>
<OrderGuid />
<BillingAddress>
<FirstName>Alex</FirstName>
<LastName>Onetime</LastName>
</BillingAddress>
<OrderItems>
<OrderItem>
<ProductName>High Mileage Oil Change</ProductName>
<Barcodes>
<Barcode>
<CodeString>A5834A7</CodeString>
</Barcode>
</Barcodes>
</OrderItem>
</OrderItems>
</Order>
<Order>
<Id>25058</Id>
<OrderGuid />
<BillingAddress>
<FirstName>Christopher</FirstName>
<LastName>Tracey</LastName>
</BillingAddress>
<OrderItems>
<OrderItem>
<ProductName>Conventional Oil Change</ProductName>
<Barcodes>
<Barcode>
<CodeString>A7E32B3</CodeString>
</Barcode>
<Barcode>
<CodeString>A6F73BA</CodeString>
</Barcode>
</Barcodes>
</OrderItem>
</OrderItems>
</Order>
</ArrayOfOrder>";
}
private静态IEnumerable ParseXml()
{
XDocument document=XDocument.Parse(GetXml());
var query=来自document.Root.Elements(“订单”)中的el
选择新订单
{
Id=(int)el.Element(“Id”),
XmlBillingAddress=新的XmlBillingAddress()
{
FirstName=(string)el.Element(“BillingAddress”).Element(“FirstName”),
LastName=(string)el.Element(“BillingAddress”).Element(“LastName”),
},
XmlOrderItems=el.Element(“OrderItems”)
.要素(“订单项”)
.Select(orderItem=>newXMLOrderItems()
{
ProductName=(字符串)orderItem.Element(“ProductName”)
}).ToList(),
//XmlBarcodes=el.Element(“OrderItems”).Element(“OrderItem”).Element(“条形码”)
XmlBarcodes=el.元素(“条形码”)
.要素(“条形码”)
.选择(条形码=>新的XmlBarcodes()
{
BarcodeNumber=(字符串)条形码.Element(“CodeString”)
})托利斯先生()
};
返回查询;
}
私有静态字符串GetXml()
{
返回@”
25057
亚历克斯
从前
高里程机油更换
A5834A7
25058
克里斯托弗
特蕾西
常规换油
A7E32B3
A6F73BA
";
}
XmlToLink.exe中发生类型为“System.NullReferenceException”的未处理异常
附加信息:对象引用未设置为对象的实例。正如您所说,您没有深入到
OrderItem
下的条形码
元素。不要忘记,el
将引用一个Order
元素,但是您需要Order->OrderItems->OrderItem->Barcode->Barcode
元素。我怀疑你想要:
XmlBarcodes = el.Element("OrderItems")
.Elements("OrderItem")
.Elements("Barcodes")
.Elements("Barcode")
.Select(barcode => new XmlBarcodes {
BarcodeNumber = (string) barcode.Element("CodeString")
})
.ToList()
但是,考虑到这实际上是OrderItem
的一部分,您可能应该更改XmlOrderItems
类以包含条形码
(顺便说一句,您的类名是复数似乎有些奇怪-每个
XmlBarcodes
对象只有一个条形码,对吗?您是正确的。每个OrderItem只能有一个条形码,因此我将解决这个问题以及一些其他命名问题。谢谢