Java 如何仅在子节点存在时检索子节点的文本
作为自动化测试的一部分,我必须使用xpath从表中获取字段的文本。Java 如何仅在子节点存在时检索子节点的文本,java,xpath,Java,Xpath,作为自动化测试的一部分,我必须使用xpath从表中获取字段的文本。 字段的层次结构:是父节点,是的子节点,如下所示。节点包含需要检索的文本值 测试 上述代码的Xpath为:\td\span\text() 但是,在某些情况下,节点将不可用。例如,当字段不包含任何颜色时,span节点将不可用,文本值将直接显示在节点下 测试 上述代码的Xpath为:\td\text() 我希望以这样的方式编写xpath:如果子节点不存在,则应从节点检索文本值;如果子节点存在,则从节点获取值。我可以使用任何xpat
字段的层次结构:
是父节点,
是
的子节点,如下所示。
节点包含需要检索的文本值
测试
上述代码的Xpath为:\td\span\text()
但是,在某些情况下,
节点将不可用。例如,当字段不包含任何颜色时,span节点将不可用,文本值将直接显示在
节点下
测试
上述代码的Xpath为:\td\text()
我希望以这样的方式编写xpath:如果子节点不存在,则应从
节点检索文本值;如果子节点存在,则从
节点获取值。我可以使用任何xpath函数一次性编写xpath吗 您可以同时获得td和span。对他们进行联合。可以使用|
运算符在xpath中执行联合。更多信息可以在这里找到只要/td
。将其转换为文本时,文本将是单元格中的文本,带或不带
XML/HTML旨在允许在文本中添加标记,如果与您的兴趣无关,则完全忽略此附加标记的存在。您可以组合两种路径,如下所示:
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));
}
}
导入java.io.StringReader;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.xpath.xpath;
导入javax.xml.xpath.XPathConstants;
导入javax.xml.xpath.XPathExpression;
导入javax.xml.xpath.XPathFactory;
导入org.xml.sax.InputSource;
公共类TestXPath{
公共静态void main(字符串[]args)引发异常{
最终字符串span=“其他测试”;
最终字符串noSpan=“其他”;
最终XPath=XPathFactory.newInstance().newXPath();
final DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
最终的XPathExpression xPath=xPath.compile(“/td[span]/span/text()|/td[not(span)]/text()”;
System.out.println(xpathxpr.evaluate(db.parse(new-InputSource(new-StringReader(span))),XPathConstants.STRING));
System.out.println(xpathxpr.evaluate(db.parse(new-InputSource(new-StringReader(noSpan)))、XPathConstants.STRING);
}
}
@TestersLogic它对我有用。发布一个完整的、最少的和可验证的示例。我需要复制/粘贴您拥有的内容,并按原样运行,无需任何修改。然后我就可以知道我们的用法有什么不同了。我使用的是冗长的xpath,所以我只是避免进一步增加xpath的长度。但是,如果我能够只在特定位置使用“|”函数,这将非常有用。例如://table………/parent::tr/(\td\text())|(\td\span\text()))。但当我不恰当地使用“(”关键字时,情况就不一样了。我们可以对此进行微调吗?@TestersLogic不支持XPath 1.0,这就是一系列库所支持的。XPath 2.0可以做很多事情,但需要Saxon来支持它。