繁体   English   中英

通过C#中的SelectNode进行迭代

[英]Iterate through SelectNodes in C#

我有一个具有以下结构的XML:

<?xml version="1.0" encoding="UTF-8"?>
<Road Version="4.0">
  <Group Caption="Church Street">
    <Group Caption="Num3">
       <Group Caption="Floor1">
          <Group Caption="ApartmentXYZ">[...]</Group>
       </Group>
    </Group>
    <Group Caption="Num4">
       <Group Caption="Floor1">
          <Group Caption="ApartmentXYZ2">[...]</Group>
          <Group Caption="ApartmentXYZ3">[...]</Group>
       </Group>
       <Group Caption="Floor2">
          <Group Caption="ApartmentXYZA">[...]</Group>
          <Group Caption="ApartmentXYZB">[...]</Group>
       </Group>
    </Group>
    <Group Caption="Num1">
       <Group Caption="Floor1">
          <Group Caption="ApartmentXYZZ">[...]</Group>
          <Group Caption="ApartmentXYZY">[...]</Group>
       </Group>
    </Group>
    <Group Caption="Num6">
       <Group Caption="Floor1">
          <Group Caption="ApartmentXYZ0">[...]</Group>
          <Group Caption="ApartmentXYZ9">[...]</Group>
       </Group>
    </Group>
[...]

目前,我正在使用此代码从具有Caption =“ NumX”的级别获取数据(这是我的初始级别):

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString);
XmlNodeList xnList = xml.SelectNodes("/Road/Group/Group");

工作正常。

现在,我必须从子级节点获取数据。

我的意思是,我进入“ Num3”节点,然后必须获取所有子级别“ Group”(标题=“ FloorX”),然后对于每个“ FloorX”,我必须提取第一个子级别“ Group”(标题=“公寓”)等...

我试图像这样使用foreach (xnList在之前的代码中定义):

foreach (XmlNode xn in xnList)
   {
   string scala = xn.Attributes["Caption"].Value;

   XmlDocument xmlFloor = new XmlDocument();
   xmlFloor.LoadXml(xn.InnerXml);
   XmlNodeList xnListFloor = xmlFloor.SelectNodes("Group");
   [...]

但这是行不通的。

哪种方法是最好的方法(也是正确的方法)?

您可以创建包含嵌套Group对象的POCO类,如下所示:

public class Road
{
    [XmlElement("Group")]
    public List<Group> Groups { get; set; }
}

public class Group
{
    [XmlElement("Group")]
    public List<Group> Groups { get; set; }

    [XmlAttribute]
    public string Caption { get; set; }
}

您可以像这样反序列化到Road:

var ser = new XmlSerializer(typeof(Road));
using (var reader = new StreamReader("XMLFile1.xml"))
{
    var road = (Road)ser.Deserialize(reader);
    Console.WriteLine(road.Groups[0].Groups[0].Groups[0].Caption);
}

这样,您可以浏览所有子组元素。 上面的示例将打印“ Floor1”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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