[英]Linq to XML (C#) parse XML tree with no attributes/id to object
我有一个类(人)和一个XML树:
<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>
人类具有诸如街道,门牌号,邮政和区域的属性。 如何填写此人对象?
我的查询中的问题是我不知道在哪里添加:
where (string)c.Element("name") == "Street"
到目前为止,我的代码:
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中提取并填写
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
标签的名称和值,并使用这些值初始化一个人。
您的Linq查询需要同时包含“ naam”值和“ value”值。 然后在foreach循环中,为每个预期的“ naam”值添加一个带有case块的switch块。 然后将“值”值存储在Person对象中。
以下代码应为您提供人员对象列表:
string sampleXml =
@"<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>";
var file = XDocument.Parse(sampleXml);
var query = from row in file.Descendants("row")
select new Person
{
Street = row.Element("number").Value,
HouseNumber = row.Element("name").Value,
Postal = row.Element("value").Value,
Area = row.Element("description").Value
};
var list = query.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.