【问题标题】:Parse XML tree with no id using LINQ to XML使用 LINQ to XML 解析没有 id 的 XML 树
【发布时间】:2012-03-14 14:44:28
【问题描述】:

要求 我想读取一个 XML 树,用遇到的属性填充我的对象,并在每次运行一个方法后(将它插入到我的数据库中)。不指定父母的数量,也没有指定顺序,例如,地址-死亡-死亡-地址-地址

输入文件

概述:

 <Root>
  <Element>
    <Element2>
      <Parent>
        <Child>
          <Grandchild>
          <Grandchild>
        </Child>
      </Parent>
    </Element2>
  </Element1>
</Root>

完整示例:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
  <Element1>
    <Element2>
      <Parent>
        <Child>
          <Grandchild>
            <number>01</number>
            <name>Person</name>
            <Rows>
              <Row>
                <number>0110</number>
                <name>ID</name>
                <value>123456789</value>
              </Row>
            </Rows>
          </Grandchild>
          <Grandchild>
            <number>08</number>
            <name>Address</name>
            <Rows>
              <Row>
                <number>1110</number>
                <name>street</name>
                <value>first aveneu</value>
              </Row>
              <Row>
                <number>1120</number>
                <name>streetnumber</name>
                <value>345</value>
              </Row>
              <Row>
                <number>1130</number>
                <name>zip</name>
                <value>2938PS</value>
              </Row>
              <Row>
                <number>1160</number>
                <name>country</name>
                <value>Germany</value>
              </Row>
            </Rows>
          </Grandchild>
        </Child>
      </Parent>  
      <Parent>  
        <Child>
          <Grandchild>
            <number>01</number>
            <name>Person</name>
            <Rows>
              <Row>
                <number>0110</number>
                <name>ID</name>
                <value>987654321</value>
              </Row>
            </Rows>
          </Grandchild>
          <Grandchild>
            <number>06</number>
            <name>Death</name>
            <Rows>
              <Row>
                <number>0810</number>
                <name>date</name>
                <value>2012-01-03</value>
              </Row>
              <Row>
                <number>0820</number>
                <name>placeOfDeath</name>
                <value>attic</value>
              </Row>
              <Row>
                <number>0830</number>
                <name>funeral</name>
                <value>burrial</value>
              </Row>
            </Rows>
          </Grandchild>
        </Child>
      </Parent>
    </Element2>
  </Element1>
</Root>

想要的结果 遇到父母后确定孙子的类型(6 号是死亡,8 号是地址)每个父母都有 1 号孙子“人”,第二个孙子要么是死亡,要么是地址。

读第一父母

Person person = new Person();
person.ID = value;   <--- filled with 123456789

person.street = value;         <--- filled with first aveneu
person.streetnumber = value;   <--- filled with 345 
person.zip = value;            <--- filled with 2938PS 
person.country = value;        <--- filled with germany

person.DoMethod(); // inserts the value in db

继续阅读下一位家长。

Person person = new Person();
person.ID = value;     <--- filled with 987654321

person.date           = value;    <--- filled with 2012-01-03
person.placeOfDeath   = value;   <--- filled with attic
person.funeral        = value;   <--- filled with burrial

person.DoMethod();  // insert the values in db

继续阅读直到找不到父母

编辑:如何为每个孩子定位第二个孙子的姓名元素?喜欢地址或死亡

代码/信用

在 Daniel Hilgarth 的帮助下,我没有进一步了解:Linq to XML (C#) parse XML tree with no attributes/id to object XML 树已经改变,我真的被困住了.. 同时我尝试发布新的工作代码......

【问题讨论】:

  • person.1110 到底是什么?它永远不会编译。
  • 你的意思是特定的.1110?它可能意味着街道。 person.street = "first aveneu" 例如。
  • 我已将 xml 示例更改为更具可读性。

标签: c# .net linq linq-to-xml linq-to-objects


【解决方案1】:

可以按照丹尼尔在您提到的问题中提出的方式完成。您需要为每个 Child 节点从 Row 节点(namevalue 节点的值)创建一个字典,然后迭代这些键值对以填写 Person 实例:

var doc = XDocument.Parse(xml);
var children = doc.Descendants("Child")
    .Select(c => c.Descendants("Row")
        .ToDictionary(
            r => r.Element("name").Value,
            r => r.Element("value").Value
        )
    );

foreach (var child in children)
{
    Person person = new Person();
    foreach (var key in child.Keys)
    {
        switch (key)
        {
            case "ID":
                person.ID = int.Parse(child[key]);
                break;
            case "street":
                person.street = child[key];
                break;
            case "streetnumber":
                person.streetnumber = child[key];
                break;
            case "zip":
                person.zip = child[key];
                break;
            case "country":
                person.country = child[key];
                break;
            case "date":
                person.date = DateTime.Parse(child[key]);
                break;
            case "placeOfDeath":
                person.placeOfDeath = child[key];
                break;
            case "funeral":
                person.funeral = child[key];
                break;
            default:
                break;
        }
    }

    person.DoMethod();
}

【讨论】:

  • 但是我使用do方法的顺序呢? death 和 address 的属性在同一个 foreach 循环中。因为“只在击中6号/死亡(或8号地址)时才填充死亡属性背后的逻辑是什么?
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多