为子节点解析 JDOM 中的 XML 文件
Parsing an XML file in JDOM for child-child nodes
我有一个 XML 文件,格式如下:
<head>
<username>bhnsub</username>
<error>0</error>
<account_id>633</account_id>
<info>
<mac>address_goes_here<mac>
<mac>address_goes_here</mac>
<mac>address_goes_here</mac>
<mac>address_goes_here</mac>
<mac>address_goes_here<mac>
</info>
</head>
我需要使用 Java DOM 解析器解析它并获取相应的值。
我需要将值放在列表中的信息下。
SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if (rootNode.getName().equals("head")) {
String username = rootNode.getChildText("username");
String error= rootNode.getChildText("error");
String account= rootNode.getChildText("account_id");
Element info= rootNode.getChildren("info");
List mac=info.getChildren("mac");
我不知道如何继续使用该列表。
这有效,使用来自 javax.xml.parsers 和 org.w3c.dom.
的东西
List<String> macvals = new ArrayList<>();
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = db.parse(new File( "head.xml" ) );
Element rootNode = document.getDocumentElement();
if (rootNode.getTagName().equals("head")) {
NodeList infos = rootNode.getElementsByTagName("info");
if( infos.getLength() > 0 ){
Element info = (Element)infos.item(0);
NodeList macs = info.getElementsByTagName("mac");
for( int i = 0; i < macs.getLength(); ++i ){
macvals.add( macs.item( i ).getTextContent() );
}
}
}
System.out.println( macvals );
首先,请确保您使用的是 JDOM 2.0.6(或更高版本,如果您以后阅读本文)。 JDOM 2.x 已经推出 5 年左右,并且更好,因为它支持 Java 泛型,它有性能改进,如果你需要的话,它也有更好的 XPath 支持。
不过,您的代码将 "easily" 写成:
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if ("head".equals(rootNode.getName())) {
String username = rootNode.getChildText("username");
String error= rootNode.getChildText("error");
String account= rootNode.getChildText("account_id");
List<String> macs = new ArrayList<>();
for (Element info : rootNode.getChildren("info")) {
for (Element mac : info.getChildren("mac")) {
macs.add(mac.getValue());
}
}
}
请注意,我在其中放置了 2 个循环。您的代码有一个错误,因为它调用:
Element info = rootNode.getChildren("info");
但是 getChildren(...)
returns 一个列表,所以这行不通。在我上面的代码中,我遍历了列表。如果只有一个 "info" 元素,则列表将只有一个成员。
另请注意,在 JDOM 2.x 中,getChildren(..)
方法 returns 元素列表:List<Element>
因此无需将结果转换为 Element
.
我有一个 XML 文件,格式如下:
<head>
<username>bhnsub</username>
<error>0</error>
<account_id>633</account_id>
<info>
<mac>address_goes_here<mac>
<mac>address_goes_here</mac>
<mac>address_goes_here</mac>
<mac>address_goes_here</mac>
<mac>address_goes_here<mac>
</info>
</head>
我需要使用 Java DOM 解析器解析它并获取相应的值。 我需要将值放在列表中的信息下。
SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if (rootNode.getName().equals("head")) {
String username = rootNode.getChildText("username");
String error= rootNode.getChildText("error");
String account= rootNode.getChildText("account_id");
Element info= rootNode.getChildren("info");
List mac=info.getChildren("mac");
我不知道如何继续使用该列表。
这有效,使用来自 javax.xml.parsers 和 org.w3c.dom.
的东西List<String> macvals = new ArrayList<>();
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = db.parse(new File( "head.xml" ) );
Element rootNode = document.getDocumentElement();
if (rootNode.getTagName().equals("head")) {
NodeList infos = rootNode.getElementsByTagName("info");
if( infos.getLength() > 0 ){
Element info = (Element)infos.item(0);
NodeList macs = info.getElementsByTagName("mac");
for( int i = 0; i < macs.getLength(); ++i ){
macvals.add( macs.item( i ).getTextContent() );
}
}
}
System.out.println( macvals );
首先,请确保您使用的是 JDOM 2.0.6(或更高版本,如果您以后阅读本文)。 JDOM 2.x 已经推出 5 年左右,并且更好,因为它支持 Java 泛型,它有性能改进,如果你需要的话,它也有更好的 XPath 支持。
不过,您的代码将 "easily" 写成:
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if ("head".equals(rootNode.getName())) {
String username = rootNode.getChildText("username");
String error= rootNode.getChildText("error");
String account= rootNode.getChildText("account_id");
List<String> macs = new ArrayList<>();
for (Element info : rootNode.getChildren("info")) {
for (Element mac : info.getChildren("mac")) {
macs.add(mac.getValue());
}
}
}
请注意,我在其中放置了 2 个循环。您的代码有一个错误,因为它调用:
Element info = rootNode.getChildren("info");
但是 getChildren(...)
returns 一个列表,所以这行不通。在我上面的代码中,我遍历了列表。如果只有一个 "info" 元素,则列表将只有一个成员。
另请注意,在 JDOM 2.x 中,getChildren(..)
方法 returns 元素列表:List<Element>
因此无需将结果转换为 Element
.