dom4j 个人总结笔记

test.xml

 

<?xml version="1.0" encoding="UTF-8"?> 

<java_min>

 

 <value>

  <aa>000</aa>

  <bb>111</bb>

  <cc>222</cc>

 </value>

 

 <value>

  <aa>333</aa>

  <bb>444</bb>

  <cc>555</cc>

 </value>

 

 <hello>

  <aa>666</aa>

  <bb>777</bb>

  <cc>888</cc>

  <dd>

     <aa>01</aa>

     <bb>02</bb>

     <cc>03</cc>

  </dd>

 </holle>

</java_min>

 

 

1.读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。

 

 

//从文件读取XML,输入文件名,返回XML文档

public Document read(String fileName) throws MalformedURLException,DocumentException{

 

     SAXReader  reader = new SAXReader();

 

     Document   doc = reader.read(new  File(fileName));

 

     return doc;

}

 

 

其中,reader的read方法是重载的,可以从InputStream,File,Url等多种不同的数据源来读取文件。得到的Document对象就代表了整个XML。

 

根据个人经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。

 

 

2.取得Root节点

 

文件读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。

 

public Element getRootElement(Document doc){

 

       return doc.getRootElement();       //此方法得到的是根元素的根元素对象,使用getName()就可以得到根元素的名字java_min

 

}

 

 

3.遍历XML树

 

DOM4J提供至少3种遍历节点的方法:

 

(1)枚举(Iterator)

 

//枚举所有节点

for(Iterator i = root.elementIterator(); i.hasNext();){ //从根元素中枚举出根元素下的多有一级元素即:value和hello元素

 

   Element element = (Element)i.next();

   //do something

 

}

 

sample:

 

File f =

new File("src/com/testXML/test.xml");

SAXReader reader =

new SAXReader();

Document doc = reader.read(f);

Element e = doc.getRootElement();

 

for(Iterator<?> i = e.elementIterator();i.hasNext();){       //每个i都是一个value对象

     Element e1 = (Element)i.next();

     for(Iterator<?> i1 = e1.elementIterator();i1.hasNext();){    //每个元素都是一个aa,bb,cc,dd对象

            logger.info(((Element)i1.next()).getName());            //输出的是所有元素的名字,即:aa,bb,cc,dd 不是元素的值,元素的值要用 getText()方法得到

     }

}

 

//枚举名称为hello的节点

for(Iterator i = root.elementIterator("hello");i.hasNext();){

 

  Element e = (Element)i.next();

  //do something

 

}

 

sample:

 

枚举dd元素底下的内容:

 

for

 

 

       for(Iterator<?> i1 = e1.elementIterator("dd");i1.hasNext();){ //从hello元素中枚举出所有的dd元素

               Element e2 = (Element)i1.next();

 

               for(Iterator<?> i3 = e2.elementIterator();i3.hasNext();){ //从dd元素中枚举出所有的元素

 

                    logger.info(((Element)i3.next()).getText());

            }

      }

}

(Iterator<?> i = e.elementIterator("hello" );i.hasNext();){  //从根元素下枚举出所有的value和hello元素

      Element e1 = (Element)i.next();

 

 

 

//枚举属性

for(Iterator i = root.attributeIterator();i.hasNext();){

 

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

  //do something

 

}

 

注意:枚举时一定要注意,必须是从根元素开始,一层一层往下枚举,不能跳级

 

(2)递归

 

递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法

 

public void treeWalk(){

 

  treeWalk(getRootElement());

 

}

 

public void treeWalk(Element element){

 

  for(int i = 0,size = element.nodeCount();i<size;i++){

 

     Node node = element.node(i);

 

     if(node instanceof Element){

 

        treeWalk((Element)node);

 

     }else{

 

        //do something

 

     }

  }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值