我必须从XML中读取一些值,下面是我的示例XML
<?xml version="1.0" encoding="utf-16"?>
<ParentNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ChildNode>
<GrandChild Name="title" Value="Mr" />
<GrandChild Name="Name" Value="Test" />
<GrandChild Name="Age" Value="25" />
<GrandChild Name="Gender" Value="Male" />
</ChildNode>
</ParentNode>
我必须读取Name和Age节点的值,这就是我正在做的事情
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(myXMLstring);
var nodes = xmlDoc.SelectNodes("/ParentNode/ChildNode");
foreach (XmlNode childrenNode in nodes)
{
}
但是这段代码只运行一次,我尝试了这个内部循环,但它没有运行
var gchild= childrenNode.SelectNodes("/GrandChild");
foreach (XmlNode namevalue in gchild)
{
}
如何获取Name
和Age
节点的值?
答案 0 :(得分:1)
您的XML只包含一个ChildNode
,因此XPATH表达式/ParentNode/ChildNode
将只返回一个结果。如果你想迭代孙子,你应该使用/ParentNode/ChildNode/GrandChild
或//GrandChild
,例如:
var nodes = xmlDoc.SelectNodes("/ParentNode/ChildNode/GrandChild");
结果将是相同的。
XPath表达式开头的单斜杠表示路径从根开始,因此/GrandChild
不返回任何内容,因为根级别没有GrandChild
注释。双斜杠//
表示层次结构中的任何位置,因此//GrandChild
将返回文件中的所有GrandChild
个节点
答案 1 :(得分:1)
SelectNodes
使用XPath表达式。在XPath中,如果表达式标有/
,它将开始相对于root进行选择。
只需使用相对xpath表达式。在你的情况下:
var gchild = childrenNode.SelectNodes("./GrandChild");
或同等的:
var gchild = childrenNode.SelectNodes("GrandChild");
或者,如果您仅旨在迭代这些GrandChild
元素,那么首先没有理由选择ChildNode
,您可以直接迭代:< / p>
var nodes = xmlDoc.SelectNodes("/ParentNode/ChildNode/GrandChild");