Linq to XML(C#)解析没有属性/对象ID的XML树 [英] Linq to XML (C#) parse XML tree with no attributes/id to object

查看:62
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆