如何从 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>