C# 使用XPath解析XML文档

C# 使用XPath解析XML文档,c#,xpath,xmldocument,C#,Xpath,Xmldocument,假设我有以下xml(一个快速示例) 为什么在我的foreach循环中,rowName总是“一”?我希望它在第一次迭代时是“一”,在第二次迭代时是“二” 似乎//name获取文档中的第一个实例,而不是我所期望的行中的第一个实例。毕竟,我是在“row”节点上调用该方法。如果这是“它是如何工作的”,那么有人能解释一下我如何改变它以满足我的需要吗 多谢各位 XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); foreach(XmlNode ro

假设我有以下xml(一个快速示例)

为什么在我的foreach循环中,rowName总是“一”?我希望它在第一次迭代时是“一”,在第二次迭代时是“二”

似乎//name获取文档中的第一个实例,而不是我所期望的行中的第一个实例。毕竟,我是在“row”节点上调用该方法。如果这是“它是如何工作的”,那么有人能解释一下我如何改变它以满足我的需要吗

多谢各位

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

foreach(XmlNode row in doc.SelectNodes("//row"))
{
   var rowName = row.SelectSingleNode("name");
}
你发布的代码是否正确?我在row.SelectNode()上得到一个编译错误,因为它不是XmlNode的成员

无论如何,我上面的示例是有效的,但是假设
节点中只有一个
节点,因此如果不是这样,您可能需要使用
SelectNodes()
而不是
SelectSingleNode()


如其他人所示,使用
.InnerText
仅获取值。

使用相对路径,例如
字符串rowName=row。选择SingleNode(“名称”).InnerText

问题出现在第二个XPath查询中:

//row
它有一个全局范围,因此无论从何处调用它,它都将选择所有
元素

如果将表达式替换为:

.//row

我将使用SelectSingleNode,然后使用InnerText属性

var rowName = row.SelectSingleNode("name").InnerText;

使用LINQ转换XML。使用System.Xml.Linq包含
在代码文件中,然后执行以下代码以获取列表

XDocument xDoc = XDocument.Load(filepath);
IEnumerable<XElement> xNames;

xNames = xDoc.Descendants("name");
XDocument xDoc=XDocument.Load(文件路径);
IEnumerable xNames;
xNames=xDoc.substands(“名称”);
这将为您提供名称元素的列表。然后,如果要将其转换为
列表
,只需执行以下操作:

List<string> list = new List<string>();
foreach (XElement element in xNames)
{
    list.Add(element.value);
}
List List=新列表();
foreach(xNames中的XElement元素)
{
列表.添加(元素.值);
}

第二个xpath以
/
开头。这是
/genderant或self::node()
的缩写,您可以看到它以
/
开头,这意味着它从文档的根搜索,无论您在什么上下文中使用它

您可能需要以下选项之一:

var rowName = row.SelectSingleNode("name");
查找作为
行的直接子节点的
名称
节点,或

var rowName = row.SelectSingleNode(".//name");
下的
任意位置查找
名称
节点*。请注意,第二个xpath中的
`导致xpath从上下文节点开始

        doc.LoadXml(xml);

            foreach(XmlNode row in doc.SelectNodes("/rows/row"))
            {
                string rowName = row.SelectSingleNode("//name").InnerText.ToString();
            }

按//行/名称选择它怎么样?这行吗?这将导致与我一开始遇到的问题相同的问题,sorryLet让我重新表述lol,我去掉了/行,只做了//行,它对我有效。
var rowName = row.SelectSingleNode(".//name");
        doc.LoadXml(xml);

            foreach(XmlNode row in doc.SelectNodes("/rows/row"))
            {
                string rowName = row.SelectSingleNode("//name").InnerText.ToString();
            }