什么';我的Xpath错了
本文关键字:Xpath 错了 我的 什么 | 更新日期: 2023-09-27 18:00:35
我有一个xml文件,我正在尝试使用c#获取所有特定节点的列表。
我的xml的精简版本是:
<file>
<AnotherNode>
</AnotherNode>
<ROWS>
<row>
<code>Code1</code>
<R>1</R>
<G>2</G>
<B>3</B>
</row>
<row>
<code>Code2</code>
<R>1</R>
<G>2</G>
<B>3</B>
</row>
</ROWS>
</file>
有多个"行"节点,我想要这些节点中所有代码的列表
我使用的XPath是:
/file/ROWS/row/code
使用此代码:
XmlDocument doc = new XmlDocument();
doc.Load(xml);
XmlNode root = doc.DocumentElement;
XmlNodeList nodeList = root.SelectNodes(xpath here);
foreach (XmlNode code in nodeList)
{
}
但我没有返回任何节点。
我做错了什么?
谢谢。
从代码中删除以下行:
root.InnerText = root.InnerText.ToLower();
这将创建一个包含所有小写标记的XML,并且您的XPath对于原始标记名来说是正确的,它将不再工作。
如果您至少使用.net 3.5,请提供解决方案和建议。
XDocument xdoc = XDocument.Load("XMLFile1.xml");
foreach (XElement element in xdoc.XPathSelectElements("//file/ROWS/row/code"))
{
}
请确保包含"使用System.Xml.XPath;"
尝试从代码中删除这一行:
root.InnerText = root.InnerText.ToLower();
我尝试将您的xpath转换为小写,并保留这一行,但重置了根。InnerText似乎破坏了XML文档的结构(在执行上述行之后,在调试器中逐步执行代码会将root.ChildNodes.Count
属性从2更改为1)。
如果您有下一个XML结构:,您的查询就会工作
<code>
<R>1</R>
<G>2</G>
<B>3</B>
</code>
其中R、G、B是代码的子节点。
但在您的情况下,R、G、B以及代码都是行的子节点:
<row>
<code> </code>
<R>1</R>
<G>2</G>
<B>3</B>
</row>
因此,查询file/ROWS/row/*[not(self::code)]
将收集所有的R、G、B值(行中除代码外的所有子节点)。
并调用doc.SelectNodes()
,而不是doc.DocumentElement.SelectNodes()
!