如何在C#中读取与父节点名称相同的xml节点子节点

时间:2019-04-04 18:12:38

标签: c# xml

我是XML的新手。我正在尝试读取一个XML节点,该节点具有未知数量的子节点,并且所有子节点都具有相同的名称。父母和孩子各有一个价值。我想按与节点相同的顺序将值放入字符串列表中。

读取数据将读取所有节点,包括子节点,内部文本并将其作为一个条目进行广告

然后我的循环这样做会导致循环的最后一次迭代发生异常

我创建了XML文件,并尝试进行while循环以读取值,然后将父节点重新分配给子节点,然后重复进行直到没有更多子节点为止。

在循环中,我只显示了子数据,跳过了父数据

XML代码段

    <DataEntry>
        <Key>1001</Key>
        <Default>test 1</Default>
        <Notes>comment 1</Notes>
        <Path>
          AAAAA
          <Path>
            BBBBB
          </Path>
        </Path>
    </DataEntry>
    <DataEntry>
        <Key>1002</Key>
        <Default>test 1</Default>
        <Notes>comment 1</Notes>
        <Path>
          AAAAA
          <Path>
            BBBBB
            <Path>
              CCCCC
              <Path>
                DDDDD
              </Path>
            </Path>
          </Path>
        </Path>
    </DataEntry>

C#代码:

...                        
                        List<string> dataPath = new List<string>();
                        XmlNode pth = xmlNode.SelectSingleNode("Path");
                        while (pth != null)
                        {
                            dataPath.Add(pth["Path"].InnerText);
                            pth = pth.SelectSingleNode("Path");
                        }
...

DataPath看起来像:

1st Data entry
dataPath[0] = BBBBB

2nd Data entry
dataPath[0] = BBBBB     CCCCC     DDDDD
dataPath[1] = CCCCC     DDDDD
dataPath[2] = DDDDD

我想要什么:

dataPath[0] = AAAAA
dataPath[1] = BBBBB
dataPath[2] = CCCCC
dataPath[3] = DDDDD

要获取所需的输出,我需要更改什么?

2 个答案:

答案 0 :(得分:0)

您可以使用以下递归函数:

      public static List<string> GetPathValues(XmlNode node)
      {
         List<string> dataPath = new List<string>();
         XmlNode pathNode = node.SelectSingleNode("Path");
         if (pathNode != null)
         {
            dataPath.Add(pathNode.ChildNodes.OfType<XmlText>().Single().Value.Trim());
            dataPath.AddRange(GetPathValues(pathNode));
         }
         return dataPath;
      }

以DataEntry XmlNode作为参数调用该方法

答案 1 :(得分:0)

经过更多搜索后,我发现了“ FirstChild”变量,我将其更改为:

List<string> dataPath = new List<string>();
XmlNode pathNode = node.SelectSingleNode("Path");
while (pth != null)
{
    dataPath.Add(pathNode.FirstChild.InnerText.Trim());
    pathNode = pathNode.SelectSingleNode("Path");
}                 

它运行良好。