java - 仅当子节点存在时如何检索子节点的文本
问题描述
作为自动化测试的一部分,我必须使用 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 吗?
解决方案
您可以组合两条路径,如下所示:
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));
}
}
推荐阅读
- c++ - 如何确定涉及c ++中除法的算术表达式的数据类型
- c - C 中的预处理器命令是否算作标记?
- php - 我的表没有在 wordpress 插件中创建
- java - Java SWT:setSize() 不适用于按钮控件
- r - 如何在带有 R 工具的 Visual Studio 中使用 RevoScaleR lib?
- javafx - 我面临 java.lang.reflect.InvocationOnTargetException
- algorithm - 当我只能使用数据库 ID 时,为什么要为 URL 缩短器使用长算法
- azure - Azure 登录无法使用 VSCode 中的 Azure 工具选项
- c++ - c++中while循环的意外行为
- python - Python:给定一个数组形式的邻接矩阵 - 我怎样才能获得连接的组件?