【问题标题】:XPath processor output as stringXPath 处理器输出为字符串
【发布时间】:2023-03-28 16:08:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: java xpath


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但这会以某种方式产生“原始”输出,例如“/foo/bar”,输出是“文本”,而不应该是“文本” ?我需要带有标签和内容的完整输出
    【解决方案2】:

    如果你使用

    xPathExpression.evaluate(document);
    

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

    xPathExpression.evaluate(document, XPathConstants.NODESET);
    

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

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

    【讨论】:

    • 是的,但有时 Xpath 输出不需要节点或节点列表,它也可以是布尔值或整数值,无论它处理什么样的 xpath 表达式,我都需要一种灵活的方式来获取输出。
    • 如果你问是否需要NODESET,它会给你一个,即使它是一个具有布尔值或整数值的节点的列表。
    • 不,当我这样做时“XPathException:无法将#NUMBER 转换为NodeList!”发生
    • 在您的问题中发布您的 XPath。当您使用 count(/foo/bar) 之类的内容时,通常会发生这种情况。
    • 当我没有将任何附加参数传递给 evaluate() 时,它返回的字符串仅包含与给定表达式匹配的第一个节点(不是全部,这很糟糕)。如果我改为将 XPathConstants.NODESET 传递给 evaluate(),则如果查询要求提供文本列表,它会正常工作,但对于 count(...) 或逻辑查询,它会引发我在上面发布的异常。我想要的代码不依赖于我传递给 evaluate() 的 NODESET、NUMBER 或 BOOLEAN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多