1

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

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

4

3 回答 3

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();
于 2013-07-08T09:00:31.923 回答
1

将您的查询源更改为:

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

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

于 2013-07-08T08:59:39.717 回答
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元素内部。

于 2013-07-08T08:59:31.983 回答