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