Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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
Java 如何仅在子节点存在时检索子节点的文本_Java_Xpath - Fatal编程技术网

Java 如何仅在子节点存在时检索子节点的文本

Java 如何仅在子节点存在时检索子节点的文本,java,xpath,Java,Xpath,作为自动化测试的一部分,我必须使用xpath从表中获取字段的文本。 字段的层次结构:是父节点,是的子节点,如下所示。节点包含需要检索的文本值 测试 上述代码的Xpath为:\td\span\text() 但是,在某些情况下,节点将不可用。例如,当字段不包含任何颜色时,span节点将不可用,文本值将直接显示在节点下 测试 上述代码的Xpath为:\td\text() 我希望以这样的方式编写xpath:如果子节点不存在,则应从节点检索文本值;如果子节点存在,则从节点获取值。我可以使用任何xpat

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


测试

上述代码的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来支持它。