查询存储在C#字符串中的XML

时间:2015-08-12 11:11:33

标签: c# xml xpath

我必须从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)
{
}

如何获取NameAge节点的值?

2 个答案:

答案 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");