我在解析XML文件时遇到问题(在下面的代码片段中删除了XML样本)。我得到的错误是
未处理的类型' System.NullReferenceException'发生在XmlToLink.exe中 附加信息:对象引用未设置为对象的实例。
我知道我的问题出在XmlBarcodes = el.Element(" Barcodes")区域,因为当我在订单编号,第一和第一部分中评论该部分时。姓氏和ProductName将被返回。我认为这是因为我没有正确地使用LINQ深入到BarcodeString,但是我已经尝试了我能想到的那个元素的每个变体,所以我想知道是否还有其他东西(对我来说不明显)是语法错了。我究竟做错了什么?
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>";
}
未处理的类型&#39; System.NullReferenceException&#39;发生在XmlToLink.exe
中附加信息:未将对象引用设置为对象的实例。
答案 0 :(得分:1)
正如您所说,您并没有深入到Barcodes
下的OrderItem
元素。不要忘记el
将引用Order
元素,但您需要Order -> OrderItems -> OrderItem -> Barcodes -> Barcode
元素。我怀疑你想要:
XmlBarcodes = el.Element("OrderItems")
.Elements("OrderItem")
.Elements("Barcodes")
.Elements("Barcode")
.Select(barcode => new XmlBarcodes {
BarcodeNumber = (string) barcode.Element("CodeString")
})
.ToList()
但是,鉴于这是 OrderItem
的一部分,您应该更改XmlOrderItems
类以包含条形码。
(顺便说一句,你的类名是复数似乎很奇怪 - 每个XmlBarcodes
对象只有一个条形码,对吗?)