使用 XPATH java 提取 XML 嵌套内容

Posted

技术标签:

【中文标题】使用 XPATH java 提取 XML 嵌套内容【英文标题】:extract XML nested contents using XPATH java 【发布时间】:2021-07-25 01:11:50 【问题描述】:

我试图在我的 pom.xml 中为我的依赖项标签提取 xml 嵌套内容。 但即使指定了位置,它也没有得到正确的依赖标签。有什么帮助吗? 这是我的 pom.xml

<project
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
        xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    
    
    <build>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant-nodeps</artifactId>
                        <version>1.8.1</version>
                    </dependency>

                </dependencies>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.intent.tm</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.0.0.1</version>
        </dependency>
        <!-- For Compress JS -->
        <dependency>
            <groupId>com.yahoo.platform.yui</groupId>
            <artifactId>yuicompressor</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.sybase</groupId>
            <artifactId>EccpressoFIPSJca</artifactId>
            <version>7.0</version>
        </dependency>

这是我的代码

private static String nodeToString(Node node) throws TransformerException 
        StringWriter buf = new StringWriter();
        Transformer xform = TransformerFactory.newInstance().newTransformer();
        xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        xform.transform(new DOMSource(node), new StreamResult(buf));
        return (buf.toString());
    



File fXmlFile = new File(prop.getProperty("testFile"));
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        Document document;
        Node result = null;
       
            document = dbf.newDocumentBuilder().parse(fXmlFile);
            XPath xPath = XPathFactory.newInstance().newXPath();
            String xpathStr = "//project//dependencies";
            result = (Node) xPath.evaluate(xpathStr, document, XPathConstants.NODE);
            log.info(nodeToString(result));

实际输出:

<dependencies>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant-nodeps</artifactId>
                        <version>1.8.1</version>
                    </dependency>

                </dependencies>

预期输出:

<dependencies>
        <dependency>
            <groupId>com.intent.tm</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.0.0.1</version>
        </dependency>
        <!-- For Compress JS -->
        <dependency>
            <groupId>com.yahoo.platform.yui</groupId>
            <artifactId>yuicompressor</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.sybase</groupId>
            <artifactId>EccpressoFIPSJca</artifactId>
            <version>7.0</version>
        </dependency>

由于某种原因,当指定的位置不是构建时,它会在构建标记中打印依赖项。我很困惑为什么会发生这种情况,并且无论如何都能得到我的预期?

【问题讨论】:

xPath.evaluate(xpathStr, document, XPathConstants.NODE);返回一个节点。 evaluate(xpathStr, document, XPathConstants.NODESET) 将返回节点列表。 // 匹配下的任何内容,因此您在项目下的任何地方都要求依赖项,不仅在子项中,而且在孙子项中。 @JPMoresmau 那么应该修改什么来实现这一点?你能把整个代码粘贴到答案中吗 线程“主”java.lang.ClassCastException 中的异常:com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList 无法转换为 org.w3c.dom.Node 我得到当我更改为 NODESET 抱歉,忽略该建议 @JP Moresmau 你能看看这个我面临的关于 xpath 的问题***.com/questions/67361493/… 【参考方案1】:

在 XPath 中,// 可以匹配任意数量的子路径,因此它也可以在构建部分中找到依赖项。如果我改变你的代码说

 String xpathStr = "/project/dependencies";

我得到了你想要的输出。一个斜线是为了匹配 XML 中的一个级别,所以我们从根目录获取项目,然后直接在项目下获取依赖项。

【讨论】:

非常感谢,我不知道我们可以用 / 我在 do.replace() 中遇到了问题,因为我得到的结果包含提取的 depededncies.. 我打算用其他一些依赖项替换文本,但不能这样做......任何帮助?

以上是关于使用 XPATH java 提取 XML 嵌套内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有 xmlns 属性的 xml 中使用 xpath 获取特定的嵌套元素? [复制]

使用 xPath 解析 xml 并提取属性值

使用 Xpath 将 XML 节点提取到 Hive 表中

如何从 XML 中仅提取标签名称(而不是值),最终使用 XPath

在 PIG 中使用 xpath 提取 XML 中的属性值

使用 Pig 在 XPath 中进行嵌套解析