Linq to XML(C#)解析没有属性/对象ID的XML树 [英] Linq to XML (C#) parse XML tree with no attributes/id to object
本文介绍了Linq to XML(C#)解析没有属性/对象ID的XML树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个类(人)和一个XML树:
I have a class (Person) and a XML tree:
<rows>
<row>
<number>1110</number>
<name>Street</name>
<value>First Avenue</value>
<description>First Avenue</description>
</row>
<row>
<number>1120</number>
<name>House number</name>
<value>281</value>
<description>281</description>
</row>
<row>
<number>1160</number>
<name>Postal</name>
<value>2552AD</value>
<description>2552AD</description>
</row>
<row>
<number>1170</number>
<name>Area</name>
<value>Peru</value>
<description>Peru</description>
</row>
</rows>
person类具有诸如街道,门牌号,邮政和区域之类的属性.如何填充此人对象?
The person class has attributes like street, house number, postal, and area. How do I fill this person object?
查询中的问题是我不知道在哪里添加
The problem in my query is that I dont know where to add:
where (string)c.Element("name") == "Street"
到目前为止,我的代码:
My code thus so far:
public class XMLparser
{
public Person XMLparse(string path)
{
Person person = new Person();
List<Person> ListPerson = new List<Person>();
XDocument file = XDocument.Load(path);
var query = from c in file.Descendants("row")
select new
{
c.Element("value").Value
};
// Loop through results
foreach (var value in query)
{
person._street = value.Value;
person._housenumber = value.Value;
person._postal = value.Value;
person._area = value.Value;
}
return person;
}
}
我要从xml中提取并填写
What I want is to take from the xml and fill it in
person._street = value.Value; //<-- First Avenue
person._housenumber = value.Value; //<-- 281
person._postal = value.Value; //<-- 2552AD
person._area = value.Value; //<-- Peru
这是原始的XMl树.
<?xml version="1.0" encoding="utf-8" ?>
<results>
<person>
<categories>
<category>
<number>01</number>
<name>Person</name>
<rows>
<row>
<number>0110</number>
<name>ID</name>
<value>value ID</value>
<description>value ID</description>
</row>
</rows>
</category>
<category>
<number>08</number>
<name>Address</name>
<rows>
<row>
<number>1110</number>
<name>Street</name>
<value>value street</value>
<description>value street</description>
</row>
<row>
<number>1120</number>
<name>House number</name>
<value>value House number</value>
<description>value House number</description>
</row>
<row>
<number>1160</number>
<name>Postal</name>
<value>value Postal</value>
<description>value Postal</description>
</row>
<row>
<number>1170</number>
<name>Area</name>
<value>value Area</value>
<description>value Area</description>
</row>
</rows>
</category>
</categories>
</person>
<person>
<categories>
<category>
<number>01</number>
<name>Person</name>
<rows>
<row>
<number>0110</number>
<name>ID</name>
<value>value ID</value>
<description>value ID</description>
</row>
</rows>
</category>
<category>
<number>08</number>
<name>Address</name>
<rows>
<row>
<number>1110</number>
<name>Street</name>
<value>value Street</value>
<description>value Street</description>
</row>
<row>
<number>1120</number>
<name>House number</name>
<value>value House number</value>
<description>value House number</description>
</row>
<row>
<number>1130</number>
<name>House number extra</name>
<value>value House number extra</value>
<description>value House number extra</description>
</row>
<row>
<number>1160</number>
<name>Postal</name>
<value>value Postal</value>
<description>value Postal</description>
</row>
<row>
<number>1170</number>
<name>Area</name>
<value>value Area</value>
<description>value Area</description>
</row>
</rows>
</category>
</categories>
</person>
</results>
推荐答案
您可以使用以下代码:
XDocument file = XDocument.Parse(xml);
var persons
= file.Descendants("rows")
.Select (x =>
{
var person = new Person();
var values = x.Descendants("row")
.GroupBy(y => y.Element("name").Value,
y => y.Element("value").Value)
.ToDictionary (y => y.Key, y => y.First());
foreach(var value in values)
{
switch (value.Key)
{
case "Street":
person.Street = value.Value;
break;
case "House number":
person.Housenumber = value.Value;
break;
case "Postal":
person.Postal = value.Value;
break;
case "Area":
person.Area = value.Value;
break;
}
}
return person;
});
它假定XML可以包含多个rows
标记,每个标记一个.然后,它获取rows
标记内每个row
标记的名称和值,并使用这些值初始化一个人.
It assumes that the XML can contain multiple rows
tags, one for each person. It then gets the name and value of each row
tag inside the rows
tags and initializes a person with the values.
这篇关于Linq to XML(C#)解析没有属性/对象ID的XML树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文