我是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
要获取所需的输出,我需要更改什么?
答案 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");
}
它运行良好。