我有这个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文件的要求之一。我该怎么办?
编辑: 感谢所有的解决方案!他们都在工作,但我可能知道什么是最好的(最佳实践等)谢谢!
答案 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
元素内。