java非递归实现Xml的遍历(多叉树遍历)


import java.util.HashMap;
import java.util.List;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Stack;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;



public class XMLDocParser2 {
Stack<Element> a = null;//栈
private HashMap<String,Element> map = new HashMap<String,Element>();// <Element Name,Element>

 //保存除根节点之外的所有节点

         public void parseXml(String xmlContent) throws Exception{

         SAXReader reader = new SAXReader();
         Document doc;
         java.io.BufferedInputStream is =null;
         try
         {
             is = new java.io.BufferedInputStream(new java.io.ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
             doc = reader.read(is);
             Element root = doc.getRootElement();
             getLeafNodes(root);
         }catch (DocumentException e){
             e.printStackTrace();
         }finally{
          try {
          if(is!=null){
          is.close();
          }
} catch (IOException e) {
e.printStackTrace();
}
         } 
}
 
 private void getLeafNodes(Element rootNode){
 a = new Stack<Element>();
 //将根节点压入栈
 a.push(rootNode);

 if(rootNode.elements().size()==0||rootNode.elements()==null){
 System.out.println("根节点没有子节点");
 }
 Element e = null;//e表示当前栈顶元素
 while(!a.empty()){
    e = a.peek();//获取栈顶元素
  a.pop();//将栈顶元素出栈
          String elementTag = e.getName();

         map.put(elementTag,xmle);

   List list = e.elements();

  int size = e.elements().size();

         //对栈顶元素进行反向遍历,入栈

  for(int i= size-1;i>=0;i--){
  a.push((Element)e.elements().get(i));
  }
 }
 }

public static void main(String[] args) throws Exception {
String xml="<html><head></head><body><mm>123</mm><oo>xxx</oo><nn>123456</nn></body></html>";
      XMLDocParser2 a = new XMLDocParser2();
a.parseXml(xml);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值