簡體   English   中英

使用Java獲取XML標簽的特定子節點

[英]Using Java to get specific child nodes of XML tag

我正在嘗試從 Wildfly POM 文件中的依賴項解析數據。 我只想要<dependencyManagement>標記中列出的依賴項,例如:

<dependencyManagement>
<dependencies>
<!--  Modules in this project  -->
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-appclient</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-arquillian-common</artifactId>
<version>${project.version}</version>
</dependency>

我知道我可以使用以下內容來獲取dependencyManagement:

        final NodeList dependenciesList = doc.getElementsByTagName("dependencyManagement");

但我想避免必須使用許多 for 循環來獲取依賴項子項,然后循環通過它來獲取每個單獨的依賴項。 有沒有辦法做到這一點? 或者我是否需要通過依賴項和每個依賴項依賴到 go 的循環?

編輯:我正在嘗試這樣的事情,但是當我嘗試遍歷我的依賴項時似乎沒有給出結果:

        final Node dependencyManagement = doc.getElementsByTagName("dependencyManagement").item(0);
        final Node deps = dependencyManagement.getFirstChild();
        final NodeList dependenciesList = deps.getChildNodes();

看看XPath

這是從 XML/HTML 中提取數據的最常用方法。

借助 XPath 查詢語言,您可以快速瀏覽所需的 XML 標簽。

例如,對於您的情況:從“/dependencyManagement”開始您的 XPath,它只會考慮“dependencyManagement”部分下的元素。

瀏覽“依賴”標簽內的每個“artifactId”的代碼:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.File;
import java.io.IOException;
import java.net.URL;


public class Test {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException {
        URL url = Test.class.getClassLoader().getResource("testfile.xml");

        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document xmlDocument = builder.parse(new File(url.getFile()));
        XPath xPath = XPathFactory.newInstance().newXPath();
        String expression = "/dependencyManagement//dependency//artifactId";
        NodeList nodes = (NodeList) xPath.evaluate(expression, xmlDocument, XPathConstants.NODESET);
        for (int i = 0; i < nodes.getLength(); ++i) {
            Element e = (Element) nodes.item(i);
            System.out.println(e.getTextContent());
        }
    }
}  

上面的代碼產生: 結果

有兩種方法可以按名稱查找 XML 元素。

您正在使用Document object 的getElementsByTagName()方法,該方法搜索整個XML 文檔。

Element object 也有一個getElementsByTagName()方法,它只搜索該元素的子樹。

您還可以使用XPath獲得更高級的表達式。

這是一個使用兩者的示例:

DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = domBuilder.parse(new File("pom.xml"));

XPath xPath = XPathFactory.newInstance().newXPath();
String expr = "/project/dependencyManagement/dependencies/dependency";
XPathNodes result = xPath.evaluateExpression(expr, document, XPathNodes.class);

for (Node node : result) {
    Element elem = (Element) node;
    Node artifactIdNode = elem.getElementsByTagName("artifactId").item(0);
    String artifactId = artifactIdNode.getTextContent();
    System.out.println(artifactId);
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.10.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-jdk8</artifactId>
                <version>2.10.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.10.3</version>
        </dependency>
    </dependencies>
</project>

Output

jackson-databind
jackson-datatype-jdk8

如您所見, jackson-datatype-jsr310未包含在結果中,因為 XPath 沒有在那里查看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM