使用XPath解析XML文档

mus*_*fan 15 c# xpath xmldocument

可以说我有以下xml(一个简单的例子)

<rows>
   <row>
      <name>one</name>
   </row>
   <row>
      <name>two</name>
   </row>
</rows>
Run Code Online (Sandbox Code Playgroud)

我试图通过使用XmlDocument和XPath解析这个(最终我可以创建行列表).

例如...

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

foreach(XmlNode row in doc.SelectNodes("//row"))
{
   string rowName = row.SelectSingleNode("//name").InnerText;
}
Run Code Online (Sandbox Code Playgroud)

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

似乎// name获取文档中的第一个实例,而不是我期望的行中的第一个实例.毕竟,我在"行"节点上调用该方法.如果这是"它是如何工作的"那么任何人都可以解释我如何改变它以满足我的需求?

谢谢

Sir*_*lot 17

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

foreach(XmlNode row in doc.SelectNodes("//row"))
{
   var rowName = row.SelectSingleNode("name");
}
Run Code Online (Sandbox Code Playgroud)

您发布的代码实际上是否正确?我在row.SelectNode()上遇到编译错误,因为它不是XmlNode的成员.

无论如何,我上面的例子有效,但假定<name>节点中只有一个<row>节点,所以你可能需要使用SelectNodes()而不是SelectSingleNode()如果不是这样的话.

正如其他人所示,.InnerText用来获得价值.


Lev*_*lho 5

使用 LINQ to XML。包含using System.Xml.Linq;在您的代码文件中,然后执行以下代码来获取您的列表

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

xNames = xDoc.Descendants("name");
Run Code Online (Sandbox Code Playgroud)

这将为您提供名称元素的列表。然后,如果您想将其变成List<string>只需这样做:

List<string> list = new List<string>();
foreach (XElement element in xNames)
{
    list.Add(element.value);
}
Run Code Online (Sandbox Code Playgroud)