如何使normalize-space()xpath函数起作用?
我目前正在尝试以下xpath
//tr[normalize-space(td/text())='User Name']
获取包含'User Name'
或'User Name'
或' User Name '
但不起作用的td的所有tr,我不知道查询有什么问题:(
我想要找到的数据采用以下格式
User Name User Name User Name
那么编写这个xpath查询的正确格式是什么?
编辑:如果数据采用以下格式,则似乎无效
x User Name x y User Name x y z User Name
那么现在我怎样才能编写xpath查询?
注意:“// tr [normalize-space(td / text())=’用户名’]”不会工作
但是“// tr / td [normalize-space(text())=’用户名’]”将起作用(但我想得到tr而不是td元素)
现在你已经编辑了这个问题,这是有道理的。 让我们考虑一下这个输入:
x User Name
和你的非工作查询:
//tr[normalize-space(td/text()) = 'User Name']
现在, td/text()
表示“选择当前节点的所有子节点的所有子文本节点”。 在这种情况下,这将产生一个包含两个文本节点x
和User Name
的节点集。
现在,您在该节点集上调用normalize-space()
。 normalize-space()
的唯一参数的类型是string?
。 由于节点集不是字符串,因此根据XPath 1.0建议的3.2节 ,转换开始了:
参数转换为类型字符串,就像调用string()函数一样。
现在让我们看一下4.2节中string()的定义 :
通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。 如果节点集为空,则返回空字符串。
在我们的例子中,第一个节点“按文档顺序”是文本节点x
,所以它是将要使用的节点; 第二个节点被忽略。 因此,您最终调用normalize-space('x')
。 当然,这不会与“用户名”相提并论。 要使其工作,请使用:
//tr[td[normalize-space(text()) = 'User Name']]
这可以转录为“选择具有子td
节点的所有tr
节点,其中第一个子text()
节点具有标准化的字符串值User Name
” – 这就是你想要的。 此外,您可以将其简化为:
//tr[td[normalize-space() = 'User Name']]
由于无参数normalize-space()
将应用于当前节点(将是td
),并处理其中的所有文本节点。
这在这里工作正常:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(@" User Name User Name User Name
"); Console.WriteLine( xmlDoc.SelectNodes( "//tr[td[normalize-space(.) = 'User Name']]").Count); // shows "3"
你能用实际的XML样本来更新你的问题吗?