为什么这个LINQ没有找到两个级别的元素?

时间:2014-08-14 15:11:33

标签: c# xml linq linq-to-xml

我在解析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

附加信息:未将对象引用设置为对象的实例。

1 个答案:

答案 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对象只有一个条形码,对吗?)