Использование Java для получения указанных c дочерних узлов тега XML - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь проанализировать данные из зависимостей в файле 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 для получения потомков зависимостей, а затем l oop для получения каждой отдельной зависимости. Есть ли способ добиться этого? Или мне нужно полагаться на циклы до go через зависимости, а затем каждую зависимость?

edit: я пытаюсь что-то подобное, но, похоже, не дает результатов, когда я пытаюсь перебрать свои зависимости:

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

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Существует 2 способа поиска XML элементов по имени.

Вы используете getElementsByTagName() метод объекта Document, который выполняет поиск в документе весь XML.

Объект Element также имеет метод 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>

Вывод

jackson-databind
jackson-datatype-jdk8

Как видите, jackson-datatype-jsr310 не включен в результат, потому что XPath там не смотрел.

2 голосов
/ 01 мая 2020

Взгляните на XPath :

Это самый распространенный способ извлечения данных из XML / HTML.

С помощью языка запросов XPath вы может быстро перемещаться по тегам XML, которые вы хотите.

Например, для вашего случая: запустите XPath из «/ dependencyManagement», и он будет рассматривать только элементы в разделе «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());
        }
    }
}  

Код выше производства: result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...