[英]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.