Java 将 NodeList 转换为 String 以检查 xml 注释

标签 java xml xpath xmldocument nodelist

我需要将现有 NodeList 转换为字符串,以便我可以检查它在断言中是否包含 xml 注释。

这是我的 xml:

<document>
<org1>
<!---- I am a comment ----->
<somenNode1> hello </somenode1>
<somenNode2> hello </somenode1>
</org1>

</document>

我在 NodeList 中,需要转换为字符串,以便我可以检查它是否包含注释。

这是我的代码

public static NodeList allNodes (final Node document, final String xPath) {
        final XPathFactory factory = XPathFactory.newInstance();
        final XPath xpath = factory.newXPath();
        final NodeList result;
        try {
            final XPathExpression productXpath = xpath.compile(xPath);
            result = (NodeList)productXpath.evaluate(document, XPathConstants.NODESET);
        } catch (XPathExpressionException e) {

            throw new RuntimeException(e);
        }
        return result;
    }



 private static void verifyXpathContains (final String expected, final String xPath, org.w3c.dom.Document xmlDoc) {
NodeList nodeList = XPathUtils.allNodes(xmlDoc, xPath);

assertThat(nodeList.toString()).contains(expected);

}

最佳答案

迭代 NodeList 并获取每个子类型,然后递归地进入树是相对简单的。

public static List<Node> extractComments(final NodeList search) {
    List<Node> result = new ArrayList<>();
    for (int i = 0, length = search.getLength(); i < length; i++) {
        Node child = search.item(i);
        if (child.getNodeType() == Node.COMMENT_NODE) {
            result.add(child);
        }
        result.addAll(extractComments(child.getChildNodes()));
    }
    return result;
}

或者如果您只对原始字符串感兴趣...

public static List<String> extractComments(final NodeList search) {
    List<String> result = new ArrayList<>();
    for (int i = 0, length = search.getLength(); i < length; i++) {
        Node child = search.item(i);
        if (child.getNodeType() == Node.COMMENT_NODE) {
            result.add(child.getTextContent());
        }
        result.addAll(extractComments(child.getChildNodes()));
    }
    return result;
}

对于上面和这个您的输入

NodeList result = XPathUtils.allNodes(document, "*/org1");
System.out.println(extractComments(result));

结果是

[[#comment:  I am a comment ]]

我还注意到您的源输入中存在一些语法错误

<document>
<org1>
<!---- I am a comment ----->      <== additional "--" is illegal inside a comment
<somenNode1> hello </somenode1>   <== close tag should match open tag
<somenNode2> hello </somenode1>   <== close tag should be somenNode2
</org1>

</document>

关于Java 将 NodeList 转换为 String 以检查 xml 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975971/

相关文章:

xml - 从命令行列出 XML 节点的 XPath

c# - 混淆 我的 Xpath 表达式应该是什么?

xslt - 如何为有效负载 xsl 设置命名空间前缀

java - 如何从 json 中获取 json

java - 在 tomcat 上部署为 WAR 的 Spring boot REST 应用程序无法正常工作

java - 如何为 List<Long> 元素声明 JaxBElement?

xml - 如何只提取某个字符后的数字?

java - 当我通过抽屉导航单击调用第二个 Activity 时,应用程序停止工作

javascript - 如何更改对 javascript 中元素的引用?

java - TestNG:在类路径中找不到类,testng.xml