【问题标题】:Why is this LINQ not finding an element two levels down?为什么这个 LINQ 没有找到向下两层的元素?
【发布时间】:2014-08-14 15:11:32
【问题描述】:

我在解析 XML 文件时遇到问题(在下面的代码 sn-p 中删除了 XML 示例)。我得到的错误是

XmlToLink.exe 中出现“System.NullReferenceException”类型的未处理异常 附加信息:对象引用未设置为对象的实例。

我知道我的问题出在 XmlBarcodes = el.Element("Barcodes") 区域,因为当我注释掉该部分时,订单号、名字和姓氏以及产品名称都会返回。我认为这是因为我没有使用 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>";
    }

XmlToLink.exe 中出现“System.NullReferenceException”类型的未处理异常

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

【问题讨论】:

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


    【解决方案1】:

    正如你所说,你没有深入到OrderItem 下的Barcodes 元素。不要忘记el 将引用Order 元素,但您需要Order -&gt; OrderItems -&gt; OrderItem -&gt; Barcodes -&gt; 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 只能有一个条形码,所以我会解决这个问题以及其他一些命名问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多