首页 > 解决方案 > 仅当子节点存在时如何检索子节点的文本

问题描述

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

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

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

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

<td>Testing</td>

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

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

标签: javaxpath

解决方案


您可以组合两条路径,如下所示:

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));
    }

}

推荐阅读