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

本文关键字:XML 字符串 存储 查询 | 更新日期: 2023-09-27 18:07:23

我必须从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节点的值?

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

您的XML只包含一个ChildNode,因此XPATH表达式/ParentNode/ChildNode将只返回一个结果。如果你想迭代孙子,你应该使用/ParentNode/ChildNode/GrandChild//GrandChild,例如:

var nodes = xmlDoc.SelectNodes("/ParentNode/ChildNode/GrandChild");

结果是一样的。

XPath表达式开头的一个斜杠表示路径从根开始,因此/GrandChild不返回任何内容,因为在根级别没有GrandChild注释。双斜杠//表示在层次结构中的任何位置,因此//GrandChild将返回文件

中所有GrandChild节点

SelectNodes使用XPath表达式。在XPath中,如果表达式以/为星号,它将开始相对于根进行选择。

只使用相对xpath表达式。在你的例子中:

var gchild = childrenNode.SelectNodes("./GrandChild");

或等价的:

var gchild = childrenNode.SelectNodes("GrandChild");
或者,如果您的只是的目的是遍历那些GrandChild元素,那么没有理由首先选择ChildNode,您可以直接迭代:
var nodes = xmlDoc.SelectNodes("/ParentNode/ChildNode/GrandChild");