<a>
  <b name = "hh">
    <c>hhhh</c>
    <d>kkk</d>
    <e>
      <f>ii</f>
    </e>
  </b>
  <b name = "hh">
    <c>pppp</c>
    <d>uuu</d>
    <e>
      <f>jj</f>
    </e>
  </b>
</a>
这个xml,我想解析获得name="hh"的以下的节点信息,应该怎么写啊?
SAXReader saxReader=new SAXReader(); Document xmlDoc=saxReader.read(new File("qwe.xml"));List list1=xmlDoc.selectNodes("//a/b/@name");  for(Iterator i=list1.iterator();i.hasNext();){

    Attribute attribute = (Attribute) i.next();

    if(attribute.getValue().equalsIgnoreCase("hh")){         往下怎么写啊?请指点一下!!!
       
    }
}                             

解决方案 »

  1.   

    如果用 dom4j的话,
    一个 xpath就可以了//**/@name="hh"具体的还要查下
      

  2.   


    你的方法我试了,路径里我用了"//**/@name="hh"/..."不行啊
      

  3.   

    方法设定遍历所有节点都需要打印属性。但是有个 开关b
    设置个 boolean b=false  (不打印)
     如果 if判断成立  boolean开始变成ture...从此开始打印childrenNode....
    如果返回根节点,或者父节点,重新置 b=false
      

  4.   

    饿。。
    boolean b
    ...for(...){
      ...
      if(attribute.getValue().equalsIgnoreCase("hh")){ b=true}  
      if(b) 打印
      if(!(i.hasNext())) b=false  
      }
      

  5.   

    看看这里的文章,应该会有帮助的
     
    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能分析  
      

  6.   

       /** 
         * 递归遍历方法 
         * 
         * @param element 
         */ 
        public void getElementList(Element element) { 
            List elements = element.elements(); 
            if (elements.size() == 0) { 
                //没有子元素 
                String xpath = element.getPath(); 
                String value = element.getTextTrim(); 
                elemList.add(new Leaf(xpath, value)); 
            } else { 
                //有子元素 
                for (Iterator it = elements.iterator(); it.hasNext();) { 
                    Element elem = (Element) it.next(); 
                    //递归遍历 
                    getElementList(elem); 
                } 
            } 
        } 
    这是一个dom4j的遍历方法,具体怎么用看你需求了~!
      

  7.   

    /**
     * <root>
     * <!--利用dom4j创建document-->
     * <book type="org.active.book">创建Document</book>
     * </root>
     * @desc:
     * @throws Exception
     */
    private void parse() throws Exception {
    // JDK1.6自带的解析方式
    javax.xml.parsers.DocumentBuilderFactory documentFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
    javax.xml.parsers.DocumentBuilder builder = documentFactory.newDocumentBuilder();
    org.w3c.dom.Document document = builder.parse(DomDocument.class.getResourceAsStream("/dom.xml"));
    Node root = document.getFirstChild();
    System.out.println("@JDK1.6 root name:"+root.getNodeName());
    NodeList childs = root.getChildNodes();
    for(int i=0;i<childs.getLength();i++){
    Node node = childs.item(i);
    if("book".equals(node.getNodeName())){
    //取到节点时,取属性
    NamedNodeMap map = node.getAttributes();
    System.out.println("@JDK1.6 book node att:"+map.getNamedItem("type"));
    }
    }
    }
    自己参考做吧!
    下面是DOM4J
    /**
     * @desc:利用String 字符串来生生成document
     * @return
     * @throws DocumentException 
     */
    private void createDocument(String str) throws Exception{
    Document document =DocumentHelper.parseText(str);
    Element root = document.getRootElement();
    System.out.println("root name :"+root.getName());
    System.out.println("root xml string :"+root.asXML());
    Element child = root.element("book");
    System.out.println("book xml String:"+child.asXML());
    System.out.println("book's type: "+child.attributeValue("type"));
    }
      

  8.   

    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class DomTest {
    public DomTest() {
    };
    /**
     * 递归遍历方法
     * 
     * @param element
     */
    public void getElementList(Element element) {
    List elements = element.elements();
    if (elements.size() == 0) {
    // 没有子元素
    String xpath = element.getPath();
    String value = element.getTextTrim();
    System.out.println("xpath:" + xpath);
    System.out.println("value:" + value);
    } else {
    // 有子元素
    for (Iterator it = elements.iterator(); it.hasNext();) {
    Element elem = (Element) it.next();
    // 递归遍历
    getElementList(elem);
    }
    }
    } public void readElement(String xpath, String fileName) {
    SAXReader saxReader = new SAXReader();
    try {
    Document xmlDoc = saxReader.read(new File(fileName));
    List list1 = xmlDoc.selectNodes(xpath);
    for (Iterator i = list1.iterator(); i.hasNext();) {
    Attribute attribute = (Attribute) i.next();
    if (attribute.getValue().equalsIgnoreCase("hh")) {
    getElementList(attribute.getParent());
    }
    }
    } catch (DocumentException e) {
    e.printStackTrace();
    }

    } public static void main(String args[]) {
    DomTest domTest = new DomTest();
    domTest.readElement("//a/b/@name", "dom4jTest.xml");
    }
    }
      

  9.   


    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class DomTest {
    public DomTest() {
    };
    /**
     * 递归遍历方法
     * 
     * @param element
     */
    public void getElementList(Element element) {
    List elements = element.elements();
    if (elements.size() == 0) {
    // 没有子元素
    String xpath = element.getPath();
    String value = element.getTextTrim();
    System.out.println("xpath:" + xpath);
    System.out.println("value:" + value);
    } else {
    // 有子元素
    for (Iterator it = elements.iterator(); it.hasNext();) {
    Element elem = (Element) it.next();
    // 递归遍历
    getElementList(elem);
    }
    }
    } public void readElement(String xpath, String fileName) {
    SAXReader saxReader = new SAXReader();
    try {
    Document xmlDoc = saxReader.read(new File(fileName));
    List list1 = xmlDoc.selectNodes(xpath);
    for (Iterator i = list1.iterator(); i.hasNext();) {
    Attribute attribute = (Attribute) i.next();
    if (attribute.getValue().equalsIgnoreCase("hh")) {
    getElementList(attribute.getParent());
    }
    }
    } catch (DocumentException e) {
    e.printStackTrace();
    }

    } public static void main(String args[]) {
    DomTest domTest = new DomTest();
    domTest.readElement("//a/b/@name", "dom4jTest.xml");
    }
    }
      

  10.   


    哥们,谢谢你 !!!!attribute.getParent().elements();我要的就是这个,太感谢你了。。学习了!!!!!!!!
      

  11.   

    List list1=xmlDoc.selectNodes("//a//b[@name='1']");我又找了一下,这个方法可以直接取到 b节点下,属性name=1的以下所有节点