仅在子节点存在的情况下,如何检索子节点的文本

时间:2018-07-06 14:30:15

标签: java xpath

作为自动化测试的一部分,我必须使用xpath从表中获取字段的文本。
字段的层次结构:<td><span>的父节点,<td><span>的子节点,如下所示。 <td>节点包含需要检索的文本值。

<span>Testing</span>
</td>
<span>

上述代码的Xpath为:\ td \ span \ text()

但是,在某些情况下,<td>节点将不可用。例如,当字段不包含任何颜色时,span节点将不可用,并且文本值将直接显示在<td>Testing</td>节点下。

<td>

上述代码的Xpath为:\ td \ text()

我想以一种这样的方式编写xpath:如果子节点不存在,则应从<span>节点检索文本值,否则,请从app:layout_anchor节点获取文本值节点存在。我可以使用任何xpath函数一次性编写xpath吗?

3 个答案:

答案 0 :(得分:0)

您可以同时获得td和跨度。并对它们执行合并。您可以使用|运算符在xpath中执行联合。可以找到更多信息here

答案 1 :(得分:0)

/td。当您将其转换为文本时,该文本将是包含或不包含<span>的单元格中的文本。

XML / HTML旨在允许在文本中添加标记,并且如果与您的兴趣无关,则完全忽略此附加标记的存在。

答案 2 :(得分:0)

您可以组合以下两条路径:

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.xml.sax.InputSource;

public class TestXPath {

    public static void main(String[] args) throws Exception {
        final String span = "<td>Other<span>Testing</span></td>";
        final String noSpan = "<td>Other</td>";

        final XPath xPath = XPathFactory.newInstance().newXPath();
        final DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        final XPathExpression xpathExpr = xPath.compile("/td[span]/span/text()|/td[not(span)]/text()");
        System.out.println(xpathExpr.evaluate(db.parse(new InputSource(new StringReader(span))), XPathConstants.STRING));
        System.out.println(xpathExpr.evaluate(db.parse(new InputSource(new StringReader(noSpan))), XPathConstants.STRING));
    }

}