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

时间:2013-07-08 08:56:40

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

我有这个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文件的要求之一。我该怎么办?

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

3 个答案:

答案 0 :(得分:2)

您可以使用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();

答案 1 :(得分:1)

将您的查询来源更改为:

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

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

答案 2 :(得分:0)

尝试将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元素内。