Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xpath:如何返回空值_Xpath - Fatal编程技术网

Xpath:如何返回空值

Xpath:如何返回空值,xpath,Xpath,我有一个Xpath,如下所示: "//<path to some table>/*/td[1]/text()" “///*/td[1]/text() 并返回所有非空tds的文本值,例如: <text1>, <text2>, <text3> <text1>,<>, <>, <text2>, <text3>, <> , 但问题是,包含上述值的节点之间可能有一些空tds元素

我有一个Xpath,如下所示:

"//<path to some table>/*/td[1]/text()"
“///*/td[1]/text()
并返回所有非空tds的文本值,例如:

<text1>, <text2>, <text3>
<text1>,<>, <>, <text2>, <text3>, <>
但问题是,包含上述值的节点之间可能有一些空tds元素: 我想要得到的是包含一些标识符的结果,即存在那些空值,例如:

<text1>, <text2>, <text3>
<text1>,<>, <>, <text2>, <text3>, <>

我尝试使用下一个:

"//<path to some table>/*/string(td[1]/text())"
“///*/string(td[1]/text())”
但它返回未定义的值

当然,我可以只获取整个节点,然后在代码中使用它(删除所有不必要的信息),但可能有更好的方法吗

这种情况下的html示例:

<html>
<body>
<table class="tablesorter">
<tbody>     
    <tr class="tr_class">
                    <td>text1</td>
                    <td>{some text}</td>                    

    </tr>

    <tr class="tr_class">
                    <td></td>
                    <td>{some text}</td>   
    </tr>

    <tr class="tr_class">
                    <td>text2</td>
                    <td>{some text}</td>                    
    </tr> 

    <tr class="tr_class">
                    <td>text3</td>
                    <td>{some text}</td>                    
    </tr> 

    <tr class="tr_class">
                    <td></td>
                    <td>{some text}</td>                    
    </tr>   

</tbody>
</table>
</body>
</html>

文本1
{一些文本}
{一些文本}
文本2
{一些文本}
文本3
{一些文本}
{一些文本}

我们只需选择
td
元素,而不是它的
text()
子节点。因此,当路径更改为
//*/td[1]
//*/td
时,您将获得一组
td
元素的节点集,无论它们是否为空,然后您可以访问每个节点的字符串内容(使用XPath(为每个元素节点选择
string(.)
)或主机环境方法,例如W3C DOM中的
textContent
,或MSXML DOM中的
text
)。这样将包括空字符串


在使用XPath 2.0或XQuery的情况下,可以直接选择
//*/td/string(.)
来获得字符串值序列。但是XPath 1.0不支持在最后一步中使用函数调用的方法,在那里,您可以选择
td
元素节点,然后在单独的步骤中访问每个节点的字符串值。

您的意思是只需要带文本的td[1],而不需要不带文本的?如果是这样,您可以使用这个xpath

//td[1][string-length(text()) > 1]

发布您的实际XML,而不是一些没有意义的虚构文本,我们可能能够帮助您检查
$x(“//table[@class='tablesorter']/tbody/*/td[1]/string(.)”
,它在devTools和FirebugWell中返回Xpath错误。我清楚地指出
//*/td/string(.)
是XPath 2.0,所以尝试在Firebug中使用它当然没有意义,而且失败了。但是如果您在Mozilla浏览器中使用XPath 1.0,那么您可以使用
//table[@class='tablesorter']/tbody/*/td[1]访问所有
td
元素节点
然后访问DOM中这些元素节点的
textContent
属性以获取字符串内容。请参阅如何使用XPath 1.0和Mozilla查找
td
元素节点,包括空节点,并输出其
textContent
。然后查看是否要使用XPath 1.0完成所有操作。该示例没有读取
textContent
,而是使用XPathAPI读取外部查询中选择的每个
td
元素的字符串值。看起来jsfiddle.net/e6wtk/1是正确答案。我正在使用类似的方法在测试框架中创建Xpath扩展点。