使用LINQ将XML转换为对象时出错

本文关键字:对象 出错 转换 LINQ XML 使用 | 更新日期: 2023-09-27 18:21:21

我有这个xml:

<?xml version="1.0" encoding="utf-8"?>
<Packet>
    <Header>
    <Id>1234-1234-1234</Id>
    </Header>
    <Customers>
        <Customer>
            <Name>Try</Name>
            <Age>20</Age>
        </Customer>
    </Customers>
</Packet>

这就是我将其转换为对象的方法:

XDocument xdoc = XDocument.Load(xml);
List<Customer> customers = (from customer in xdoc.Element("Customers").Element("Customer")
select new Customer
{
     Name = customer.Element("Name").Value,
     Age = customer.Element("Age").Value
}).ToList();

我的问题是,当我试图运行这段代码时,我得到了一个异常错误,说对象引用没有设置为实例。

但是当我把xml改成这样时:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
<Customer>
<Name>Try</Name>
<Age>20</Age>
</Customer>
</Customers>

它开始工作,我得到了名字和年龄。但是,数据包和标头是我的xml文件的要求之一。我该怎么做?

编辑:感谢所有的解决方案!它们都在起作用,但我可以知道什么是最好的(最佳实践等)谢谢!

使用LINQ将XML转换为对象时出错

您可以使用Descendants()方法在xml树中查找元素。

List<Customer> customers = (from customer in xdoc.Descendants("Customer")
select new Customer
{
     Name = customer.Element("Name").Value,
     Age = customer.Element("Age").Value
}).ToList();

将查询源更改为:

xdoc.Root.Element("Customers").Elements("Customer")

Element方法查找当前级别上的元素,该元素是XDocument的根。这就是查询不起作用的原因。

尝试将LINQ查询更改为:

XDocument xdoc = XDocument.Load(xml);
List<Customer> customers = (from customer in xdoc.Element("Packet").Element("Customers").Element("Customer")
select new Customer
{
     Name = customer.Element("Name").Value,
     Age = customer.Element("Age").Value
}).ToList();

因为Customers元素位于Packet元素内部。