繁体   English   中英

Linq to XML(C#)解析没有属性/ id的XML树

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM