DOM4J的使用(一)-----读取XML

DOM4j是一个易用的,开源的JAVA操作XML的API,相对于DOM,JDOM来说,DOM4j是性能和易用行最佳的。由于经常使用,所以做一下笔记,也供其他刚接触这方面的人学习。
先贴出我用的XML文件,文件看起来可能有点乱,不过相信还是能读懂的:
<?xml version="1.0" encoding="UTF-8"?>
    <root>
         <a id="a1" name="a11">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1</a>
         <a id="a2" name="a22">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2</a>
         <a id="a3" name="a33">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3</a>
         <b id="b1" name="b11">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</b>
         <b id="b2" name="b22">b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2</b>
         <c id="c1" name="c11">cccccccccccccccccccccccccccccccccccccccccccc</c>
         <f id="f1" name="f11" length="44" type="string">fffffffffffffffffffffffffffffffffffffff</f>
         <e id="e1" name="e11">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</e>
         <d id="d1" name="d11">
                  <d1>
                            <d11>d11d11d11d11d11d11d11d11d11d11</d11>
                           <d11>d22d22d22d22d22d22d22d22d22d22</d11>
                           <d11>d33d33d33d33d33d33d33d33d33d33</d11>
                  </d1>
                  <d2 id="d22" name="d222" type="string">d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2</d2>
                  <d3>d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3</d3>
         </d>
         <d id="d2" name="d22">d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2</d>
</root>
|
读取之前首先要得到要读取的XML文件的对象Document, 得到Document对象的方式主要有三种:
/**
  * 通过读取XML文件,返回一个XML文档对象
  * @param pathXML XML文件路径
  * @return Document对象
  * @throws DocumentException 获取Document对象时出现的异常
  */
 public Document getDocObjByFile(String pathXML) throws DocumentException {
     SAXReader reader = new SAXReader(); //SAXReader主要用于解析XML文件
     Document document = reader.read(new File(pathXML)); //从指定的文件中读取Document
     return document;
 }
 
 /**
  * 通过读取XML文本,返回一个XML文档对象
  * @param textXML XML文本
  * @return Document对象
  * @throws DocumentException 获取Document对象时出现的异常
  */
 public Document getDocObjByText(String textXML) throws DocumentException {
       //DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类
      //将textXML解析为一个XML文档并返回一个新创建的Document
      Document document = DocumentHelper.parseText(textXML);
       return document;
 }
 
 /**
  * 自动创建一个Document对象,主要用于创建XML文件时使用
  * @return Document对象
  */
 public Document getDocObjByAuto() { 
       //创建一个Document对象
       Document document = DocumentHelper.createDocument();
       return document;
 }

既然得到Dcument对象了,那么下来就是要读取各节点了,读取之前要获得根节点,否则无法读取:
Element root = document.getRootElement(); //获取根节点

以下是获取各节点的方法(一定要对照XML文件来看哟,否则可能会迷糊的!!!!!):

//遍历根节点下的子节点
   for (Iterator it = root.elementIterator(); it.hasNext();) {
        Element child = (Element) it.next();
        String name = child.getName(); //获取节点的名字
        String text = child.getText(); //读取节点的内容
        System.out.println("节点名:" + name + "     内容:" + text);
   }

//遍历根节点下指定的子节点a
   for (Iterator it = root.elementIterator("a"); it.hasNext();) {
        Element child = (Element) it.next();
        String name = child.getName(); //获取节点的名字
        String text = child.getText(); //读取节点的内容
        System.out.println("节点名:" + name + "     内容:" + text);
   }

//遍历根节点的子节点的属性id
   for (Iterator it = root.elementIterator(); it.hasNext();) {
        Element child = (Element) it.next();
        String name = child.getName(); //获取节点的名字
         Attribute att = child.attribute("id");  //获取属性id
        String text1 = att.getText(); //读取属性的值
        System.out.println("方法一     节点名:" + name + "     属性id:[ " + text1 + " ]");    
        String text2 = child.attributeValue("id"); //读取属性id的值
        System.out.println("方法二     节点名:" + name + "     属性id:[ " + text2 + " ]");
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
   }

//遍历f节点的所有属性
   Element elf = root.element("f"); //获取指定的节点f
   System.out.println("方法一:" + elf.getText()); //方法一:获取指定节点的内容
   System.out.println("方法二:" + root.elementText("f")); //方法二:获取指定节点的内容
   System.out.println("----------------------------------------------------");
   for (Iterator it = elf.attributeIterator(); it.hasNext();) {
        Attribute att = (Attribute) it.next();
        String name = att.getName(); //获取属性名字
        String text = att.getText(); 获取属性值
        System.out.println("属性名:" + name + "     属性值:" + text);
   }

//遍历d节点的所有子节点     方法一:
   Element eld = root.element("d"); //获取指定的节点
   for (Iterator it = eld.elementIterator(); it.hasNext();) {
        Element el = (Element) it.next();
        String name = el.getName();
        String text = el.getText();
        System.out.println("方法一     节点名:" + name + "     内容:" + text);
   }
   
   System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
   
   //遍历d节点的所有子节点     方法二:
   List eld1 = root.selectNodes("/root/d/*"); //获取指定的节点
   for (Iterator it = eld1.iterator(); it.hasNext();) {
        Node el = (Node) it.next();
        String name = el.getName();
        String text = el.getText();
        System.out.println("方法二     节点名:" + name + "     内容:" + text);
   }

//遍历d节点中d2子节点的所有属性
   Element eld2 = root.element("d").element("d2"); //获取指定的节点
   for (Iterator it = eld2.attributeIterator(); it.hasNext();) {
        Attribute att = (Attribute) it.next();
        String name = att.getName();
        String text = att.getText();
        System.out.println("属性名:" + name + "     属性值:" + text);
   }

//遍历d1节点下的子节点d11     方法一:
    List d11 = root.element("d").element("d1").elements("d11");
   for (Iterator it = d11.iterator(); it.hasNext();) {
        Element child = (Element) it.next();
        String name = child.getName(); //获取节点的名字
        String text = child.getText(); //读取节点的内容
        System.out.println("方法一     节点名:" + name + "     内容:" + text);
   }
   
   System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
   
   //遍历d1节点下的子节点d11     方法二:
   List nodes = root.selectNodes("/root/d/d1/d11");
   for (Iterator it = nodes.iterator(); it.hasNext();) {
        Node child = (Node) it.next();
        String name = child.getName(); //获取节点的名字
        String text = child.getText(); //读取节点的内容
        System.out.println("方法二     节点名:" + name + "     内容:" + text);
   }

//根据属性id遍历某节点
   List elb2 = root.selectNodes("/root/b[@id='b2']");
   for (Iterator it = elb2.iterator(); it.hasNext();) {
        Node b2  = (Node) it.next();
        String name = b2.getName();
        String text = b2.getText();
        String id = b2.valueOf("@id"); //得到属性id的值
        System.out.println("节点名:" + name + "     内容:" + text + "    id:" + id);
   }

//根据属性id遍历某节点的子节点
   List eldd = root.selectNodes("/root/d[@id='d1']/*");
   for (Iterator it = eldd.iterator(); it.hasNext();) {
        Node b2  = (Node) it.next();
        String name = b2.getName();
        String text = b2.getText();
        String id = b2.valueOf("@id");
        System.out.println("节点名:" + name + "     内容:" + text + "    id:" + id);
   }

如果有不足的地方,欢迎指出(提示:源码会在所有文章写完后公布)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值