Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使normalize-space()xpath函数工作?_C#_Xpath - Fatal编程技术网

C# 如何使normalize-space()xpath函数工作?

C# 如何使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>&

我目前正在尝试以下xpath

//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的答案,但他给出了一些很好的解释。但我也很感谢您的答案,您的答案更快:)