C# 如何使normalize-space()xpath函数工作?
我目前正在尝试以下xpathC# 如何使normalize-space()xpath函数工作?,c#,xpath,C#,Xpath,我目前正在尝试以下xpath //tr[normalize-space(td/text())='User Name'] 要获取包含td的所有tr,该td包含“用户名”或“用户名”或“用户名”,但它不起作用,我不知道查询有什么问题:( 我要查找的数据的格式如下 <tr><td>User Name</td></tr> <tr><td>User Name</td></tr> <tr>&
//tr[normalize-space(td/text())='User Name']
要获取包含td的所有tr,该td包含“用户名”
或“用户名”
或“用户名”
,但它不起作用,我不知道查询有什么问题:(我要查找的数据的格式如下
<tr><td>User Name</td></tr>
<tr><td>User Name</td></tr>
<tr><td> User Name </td></tr>
<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>
用户名
用户名
用户名
那么,编写此xpath查询的正确格式是什么
编辑:
如果数据采用以下格式,则似乎不起作用
<tr><td>User Name</td></tr>
<tr><td>User Name</td></tr>
<tr><td> User Name </td></tr>
<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>
xUser名称
XY用户名
xyz用户名
那么现在如何编写xpath查询呢?注意:“//tr[normalize space(td/text())='User Name']”不起作用
但是“//tr/td[normalize space(text())='User Name']”会起作用(但我想得到的是tr而不是td元素)在这里效果很好:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(@"
<table>
<tr><td>User Name</td></tr>
<tr><td> User Name </td></tr>
<tr><td> User Name </td></tr>
</table>");
Console.WriteLine(
xmlDoc.SelectNodes(
"//tr[td[normalize-space(.) = 'User Name']]").Count); // shows "3"
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.LoadXml(@)
用户名
用户名
用户名
");
控制台写入线(
xmlDoc.SelectNodes(
“//tr[td[规范化空格(..='User Name']]”。计数);//显示“3”
<>你能用一个实际的XML样本来更新你的问题吗? 现在你已经编辑了这个问题,这是有意义的。让我们考虑一下这个输入:
<tr><td>x</td><td>User Name</td></tr>
现在,td/text()
现在,在该节点集上调用normalize-space()
。normalize-space()
的唯一参数类型是string?
。由于节点集不是字符串,根据XPath 1.0的建议,转换开始:
通过调用string()函数,参数被转换为string类型
现在让我们看看第4.2节中字符串()的用法:
通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串
在我们的示例中,“文档顺序”中的第一个节点是文本节点x
,因此它将被使用;第二个节点将被忽略。因此,您最终调用规范化空间('x')
。很自然,这将不等于“用户名”。要实现这一点,请使用:
//tr[td[normalize-space(text()) = 'User Name']]
这可以转录为“选择所有具有子td
节点的tr
节点,其第一个子text()
节点的规范化字符串值为用户名
”—这是您想要的。此外,您可以将其简化为:
//tr[td[normalize-space() = 'User Name']]
因为无参数normalize-space()
将应用于当前节点(即td
),并处理其中的所有文本节点。请显示一个输入数据示例,从
开始。乍一看一切都很好。我怀疑问题不在于查询,而在于如何使用结果。能否在上下文中显示查询?如果是XSLT,则是调用它并使用结果的XSLT代码,如果是C代码直接,然后是代码。我使用c#selectnodes()使用结果。但实际上我正在调试器窗口中编写语句。我得到了0个结果。似乎是数据问题。我现在将检查它。实际文件很大,因此无法上载。但是示例与您拥有的一样,但它对我不起作用。您不需要上载整个文件,只是有问题的一小部分更新了我的xpath,它可以与您的示例数据一起使用;请看一看对不起,我接受了Pavel Minaev的答案,但他给出了一些很好的解释。但我也很感谢您的答案,您的答案更快:)