假设有一个xml,有很多节点,其中有个节点是student,属性是id,它下面有name和age的子节点,这个student节点不止一个,有很多个,而且分布在不同的地方,我怎样用dom4j搜索出所有的student,并且打印它id,name,age的值

解决方案 »

  1.   


    <?xml version="1.0" encoding="utf-8"?>
    <a>
    <b>1</b>
    <c id="c2">
    <c1>2</c1>
    </c>
    <c id="c3">
    <c1>3</c1>
    </c>
    <c id="c4">
    <c1>4</c1>
    </c></a>
    public class Dom4j {

    private SAXReader reader ;
    private Document   document;
    private static String path = "c:/xml/dom4j/Dom4jSample.xml";


    public Dom4j(String str) throws DocumentException {
    reader = new SAXReader();
    reader.setValidation(false);
        document = reader.read(new File(str));
        
    } public void getInfo() {
    Element root = document.getRootElement();

    QName qname = new QName("c");
    List<Element> list = root.elements(qname);

    for(int i= 0;i<list.size();i++) {
    Element e = list.get(i);
    System.out.println(e.attribute("id").getText()); //属性
    System.out.println(e.element("c1").getText());
    }
    public static void main(String[] args) throws DocumentException, IOException, ClassNotFoundException { Dom4j test = new Dom4j(path);
    test.getInfo(); }
    }好像只能找到同一层下的相同节点.
      

  2.   


    万一c节点在某个节点的下面,而不是在根节点下面呢

    <a>
    <b>1</b>
       <f>
         <c id="c2">
         <c1>2</c1>
         </c>     <c id="c3">
         <c1>3</c1>
         </c>
         <c id="c4">
         <c1>4</c1>
         </c>
       <f/>
    </a>
      

  3.   

    用 xpath 就好了啊,直接一次拿到所有符合xpath模板的节点
      

  4.   

    好了,做出来了List<Element> list1 = document.selectNodes("//A/C");
    for(Element n : list1)
    {
    //打印元素中属性为id的值
    System.out.println("C id = "+ n.attribute("id").getText());
    //循环得到其子元素
    for(Iterator<Element> i = n.elements().iterator();i.hasNext();)
    {
    Element element = (Element)i.next();
    //打印这个子元素的name和text
    System.out.println(element.getName()+":"+element.getText());
    }
    System.out.println();
    }