0

使用 javax.xml.xpath 在 java 中进行标准 XPath 处理的工作方式如下:

  1. 我为要处理的 xml 提供名称
  2. 我将 xpath 表达式作为字符串提供。
  3. 我获得存储为节点列表的答案,或者最终作为单个值,具体取决于我选择的输出类型。

我需要在 java 中编写几个测试,它们基本上应该像这样工作:我提供 xpath 表达式作为字符串,它检查这个表达式的 xpath 输出是否等于某些指定的输出(也作为字符串提供)。所以我不需要遍历节点树之类的东西,我只需要获得 xpath 处理器输出作为字符串。有没有办法做到这一点?

4

2 回答 2

0

XPath.evaluate(expression, inputSource)似乎做你想做的事。

编辑:这是一些示例代码:

String xml = "<foo><bar>text</bar></foo>";
Reader reader = new StringReader(xml);
InputSource inputSource = new InputSource(reader);
XPath xpath = XPathFactory.newInstance().newXPath();
System.out.println(xpath.evaluate("/foo/bar", inputSource));

编辑:这个问题表明没有可以立即用于实现目标的 java api。如果您正在测试 XML,那么您可能想看看XmlUnit

于 2012-08-24T12:54:19.873 回答
0

如果你使用

xPathExpression.evaluate(document);

你的 DOM 文档在哪里document,那么它将返回它匹配的第一个节点的字符串表示形式。对于您认为 XPath 正在选择单个文本节点的用例,这可能很好。如果不是这种情况,您可以编写一些从以下位置返回的toString()方法NodeList

xPathExpression.evaluate(document, XPathConstants.NODESET);

编辑 1:这是一篇关于将 a 转换为 XML 文档并打印它的SO文章。NodeList

编辑 2:如果您有使用count返回单个值的 XPath 表达式或逻辑运算符,那么您可以捕获抛出的异常并采取适当的操作:

try {
    NodeList nodeList = (NodeList) xPathExpression.evaluate(document, XPathConstants.NODESET);
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        System.out.println(node.getNodeName());
    }
} catch (XPathExpressionException e) {
    String result = xPathExpression.evaluate(document);
    System.out.println(result);
}
于 2012-08-24T12:54:29.037 回答