如何从 java dom4j 中的 xml 获取子节点的属性?
How can I get childnode's attribute from xml in java dom4j?
我正在尝试从我的 xml file.For 示例中获取子节点的属性,文件名为 bb.xml
,
xml就是这样:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb name="MainMenu">
<ccc name="abc" Classes="1"
A="2"
B="3"/>
</bbb>
<bbb name="Mainwindow">
<ccc name="abc" Classes="4"
A="3"
B="2"/>
</bbb>
</aaa>
和主要 java 文件是这样的:
public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("D:/bb.xml"));
List itemList = doc.selectNodes("/aaa");
for (Iterator iter=itemList.iterator(); iter.hasNext();) {
Element el = (Element)iter.next();
String name = el.attributeValue("name");
System.out.println("name:"+name);
String b = el.attributeValue("B");
System.out.println("b:"+b);
}
我在控制台中得到了结果:
name:null
b:null
但我想要的结果是:
name:MainMenu
b:3
name:Mainwindow
b:2
怎么算出来的?
快速而肮脏:
public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("D:/bb.xml"));
Element root = doc.getRootElement();
Iterator bbbIt = root.elementIterator();
while (bbbIt.hasNext()) {
Element bbb = ((Element) bbbIt.next());
System.out.println("name:" + bbb.attributeValue("name"));
Iterator cccIt = bbb.elementIterator();
while (cccIt.hasNext()) {
System.out.println("b:"
+ ((Element) cccIt.next()).attributeValue("B"));
}
}
}
更好的解决方案(因为灵活性)是使用 Java 本机 org.w3c.dom
包。这样解决方案将如下所示:
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document myDoc = db.parse(new File("D:/bb.xml"));
org.w3c.dom.NodeList bbbNodes = myDoc.getElementsByTagName("bbb");
for (int i=0; i < bbbNodes.getLength(); i++) {
if (bbbNodes.item(i).hasAttributes())
System.out.println(bbbNodes.item(i).getAttributes().getNamedItem("name"));
org.w3c.dom.NodeList cccNodes = bbbNodes.item(i).getChildNodes();
for (int j=0; j < cccNodes.getLength(); j++) {
if (cccNodes.item(j).hasAttributes())
System.out.println(cccNodes.item(j).getAttributes().getNamedItem("B"));
}
}
无论如何:不要忘记 xml.
中的结尾 </aaa>
我正在尝试从我的 xml file.For 示例中获取子节点的属性,文件名为 bb.xml
,
xml就是这样:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb name="MainMenu">
<ccc name="abc" Classes="1"
A="2"
B="3"/>
</bbb>
<bbb name="Mainwindow">
<ccc name="abc" Classes="4"
A="3"
B="2"/>
</bbb>
</aaa>
和主要 java 文件是这样的:
public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("D:/bb.xml"));
List itemList = doc.selectNodes("/aaa");
for (Iterator iter=itemList.iterator(); iter.hasNext();) {
Element el = (Element)iter.next();
String name = el.attributeValue("name");
System.out.println("name:"+name);
String b = el.attributeValue("B");
System.out.println("b:"+b);
}
我在控制台中得到了结果:
name:null
b:null
但我想要的结果是:
name:MainMenu
b:3
name:Mainwindow
b:2
怎么算出来的?
快速而肮脏:
public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("D:/bb.xml"));
Element root = doc.getRootElement();
Iterator bbbIt = root.elementIterator();
while (bbbIt.hasNext()) {
Element bbb = ((Element) bbbIt.next());
System.out.println("name:" + bbb.attributeValue("name"));
Iterator cccIt = bbb.elementIterator();
while (cccIt.hasNext()) {
System.out.println("b:"
+ ((Element) cccIt.next()).attributeValue("B"));
}
}
}
更好的解决方案(因为灵活性)是使用 Java 本机 org.w3c.dom
包。这样解决方案将如下所示:
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document myDoc = db.parse(new File("D:/bb.xml"));
org.w3c.dom.NodeList bbbNodes = myDoc.getElementsByTagName("bbb");
for (int i=0; i < bbbNodes.getLength(); i++) {
if (bbbNodes.item(i).hasAttributes())
System.out.println(bbbNodes.item(i).getAttributes().getNamedItem("name"));
org.w3c.dom.NodeList cccNodes = bbbNodes.item(i).getChildNodes();
for (int j=0; j < cccNodes.getLength(); j++) {
if (cccNodes.item(j).hasAttributes())
System.out.println(cccNodes.item(j).getAttributes().getNamedItem("B"));
}
}
无论如何:不要忘记 xml.
中的结尾</aaa>