我目前正在尝试以下xpath
//tr[normalize-space(td/text())='User Name']
Run Code Online (Sandbox Code Playgroud)
让所有包含包含TD的TR 'User Name'
或'User Name'
或' User Name '
,但它不工作,我不知道什么是错的查询:(
我想找到的数据是按以下格式
<tr><td>User Name</td></tr>
<tr><td>User Name</td></tr>
<tr><td> User Name </td></tr>
Run Code Online (Sandbox Code Playgroud)
那么编写这个xpath查询的正确格式是什么?
编辑:如果数据采用以下格式,则似乎无效
<tr><td>x</td><td>User Name</td></tr>
<tr><td>x</td><td>y</td><td>User Name</td></tr>
<tr><td>x</td><td>y</td><td>z</td><td> User Name </td></tr>
Run Code Online (Sandbox Code Playgroud)
那么现在我该如何编写xpath查询?
注意:"// tr [normalize-space(td/text())='用户名']"不会工作
但是"// tr/td [normalize-space(text())='用户名']"将工作(但我想得到tr而不是td元素)
Pav*_*aev 26
现在您已经编辑了这个问题,这是有道理的.让我们考虑一下这个输入:
<tr><td>x</td><td>User Name</td></tr>
Run Code Online (Sandbox Code Playgroud)
和你的非工作查询:
//tr[normalize-space(td/text()) = 'User Name']
Run Code Online (Sandbox Code Playgroud)
现在,td/text()
意味着"选择td
当前节点的所有子节点的所有子文本节点".在这种情况下,这将产生由两个文本节点的节点集,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']]
Run Code Online (Sandbox Code Playgroud)
这可以转录为"选择所有tr
具有子td
节点的节点,其中第一个子text()
节点具有规范化的字符串值User Name
" - 这就是您想要的.此外,您可以将其简化为:
//tr[td[normalize-space() = 'User Name']]
Run Code Online (Sandbox Code Playgroud)
由于无参数normalize-space()
将应用于当前节点(将是td
),并处理其中的所有文本节点.