C# 为什么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正确地深入到条形码字符串,但我已经尝试了各种方法来获取我能想到的元素,所以我想知道语法是否有其他

我在解析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只能有一个条形码,因此我将解决这个问题以及一些其他命名问题。谢谢