gpt4 book ai didi

java - 读取 XML 元素的内部 XML

转载 作者:行者123 更新时间:2023-12-01 23:32:43 26 4
gpt4 key购买 nike

我正在浏览 StackOverflow,但找不到最佳答案。我需要用JAVA读取XML文件。我的 XML 文件如下所示:`

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<server>
<server01>
<department>A1</department>
<department>A2</department>
</server01>
<server02>
<department>A1</department>
<department>A2</department>
</server02>
</server>

是否有可能读取 <server01> 之间的 Java 元素和<server02> ,排除文件的其余部分?或者我需要使用不同的标签?我找到了如何读取父节点的方法:

NodeList serversNames = xmlD.getDocumentElement().getChildNodes();

for (int i = 0; i < serversNames.getLength(); i++) {
Node node = serversNames.item(i);
if (node instanceof Element) {
Element childElement = (Element) node;
System.out.println("tag name: " + childElement.getTagName());
}
}

我能够读取所有部门标签并将它们保存到数组中:

NodeList serverName = xmlD.getElementsByTagName("department");

serversList = new String[serverName.getLength()];

System.out.println("zasieg: " + serverName.getLength());

for (int temp = 0; temp < serverName.getLength(); temp++) {
Element shareName = null;

shareName = (Element) serverName.item(temp);

serversList[temp] = shareName.getTextContent();
System.out.println(temp + " - " + serversList[temp]);
}

那么,是否有可能只读取父节点的元素?仅 SERVER01 的元素?

最佳答案

XPath 就是您想要的。出于所有意图和目的,您可以将 xpath 视为 sql,只是它用于 xml 文档而不是数据库。这是一个使用 Java 的简单示例(请记住 xpath 是一个标准,而不是特定于 java,因此您可以在几乎任何流行语言中找到许多方法来执行此操作):

    // Load document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse( new FileInputStream( "/tmp/xml" ) );

// Create XPath expression
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile( "//server01" );

// Find node 'server01'
Node node = (Node) expr.evaluate( doc, XPathConstants.NODE );
if( node == null ) {
System.out.println( "Node not found" );
System.exit( 0 );
}

// Extract departments
Element server01 = (Element) node;
for( int k = 0 ; k < server01.getChildNodes().getLength() ; k++ ) {
Node childNode = server01.getChildNodes().item( k );
// Check if current node is a department node
if( "department".equals( childNode.getNodeName() ) ) {
System.out.println( childNode.getNodeName() + ": " + childNode.getTextContent().trim() );
}
}

Is there is a possibility to avoid this?

是的,只需更改 XPath 表达式即可仅接收您需要的节点。

// Load document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse( new FileInputStream( "/tmp/xml" ) );

// Create XPath expression
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile( "//server01/department" );

// Find nodes 'department' under node 'server01'
NodeList node = (NodeList) expr.evaluate( doc, XPathConstants.NODESET );

// Extract departments
for( int k = 0 ; k < node.getLength() ; k++ ) {
Node childNode = node.item( k );
// Check if current node is a department node
if( "department".equals( childNode.getNodeName() ) ) {
System.out.println( "[" + k + "] " + childNode.getNodeName() + ": " + childNode.getTextContent().trim() );
}
}

您必须收到下一个输出:

[0] department: A1
[1] department: A2

关于java - 读取 XML 元素的内部 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19101193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com