在C#中遍历SelectNodes
本文关键字:SelectNodes 遍历 | 更新日期: 2023-09-27 18:21:48
我有一个具有以下结构的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"(Caption="FloorX"),然后对于每个"FloorX",我必须提取第一个子级别的"Group"(Caption="Apartment")等…
我试着这样使用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",例如