Dom4j解析xml

    现在先谈下关于XML的一些概念吧 ! xml是一种通用的数据交换的格式,为实现计算机之间的文档交换而设计的文档内容编写规范,语法与HTML相似.XML的作用:统一信息的结构,实现不同系统之间的相互通信
目前许多系统的配置文件都使用XML格式,例如现在流行的SSH框架的配置文件都用的是xml的格式,配置文件就是记录应用程序的配置信息的文件。XML 是一种标记语言,通过使用标记来说明文本的意义和所代表的信息。XML 没有固定的标记,允许用户随便发明和创建自己的标记。XML文档是树形结构的。以下是xml基本语法的注意事项,下面将用个正确的例子做为参考!元素和属性:
1.XML 文档的主体由元素组成。一个XML元素由一个标记来定义,包括开始和结束标记以及其中的内容
2.没有嵌套在其他元素内的元素叫做根元素
3.若元素中没有嵌套子元素和数据,这样的元素叫做空元素
4.所有的标记都必须有结束标记或者使用空元素的结束说明
5.XML 中不允许使用标签交叉来破坏文档的结构化层次关系
6.XML标记名称区分大小写
7.XML标记名称中不能包括空格
8.可以为 XML 标签设置属性,XML中的属性也可以随便定义。一个标签可以有多个属性,每个属性都有名称和取值
9.XML 中属性值一定要用双引号或单引号引起来

例题:<?xml version="1.0" encoding="UTF-8"?>
<customers>
 <customer id="101" sex="man">
  <name>Tom</name>
  <age>12</age>
  <email>[email protected]</email>
 </customer>
 <customer id="102" sex="women">
  <name>Jerry</name>
  <age>22</age>
  <email>[email protected]</email>
 </customer>
</customers>

    现在再来介绍下DOM4J,我初开始看到这个名词的时候,把它读成了“动物世界”,呵,其实这个读法是错误的,4只能读成four!佟老师说,这样才算专业的!不过再说DOM4J自己前先介绍下xml的四种解析技术与比较:

1.DOM:DOM 解析器把 XML 文档转化为一个包含其内容的树,并能够对树进行遍历。用 DOM 解析模型的长处是编程容易,能够很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的需要比较高,尤其是碰到很大的 XML 文档的时候。
2.SAX:SAX 解析器采用了基于事件的模型(在解析 XML 文档的时候能够触发一系列的事件,当发现给定的tag的时候,他能够激活一个回调方法,告诉该方法定制的标签已找到)。因为他让程序员自己来决定所要处理的tag,所以当只需要处理文档中所包含的部分数据时,SAX 有良好的表现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
3.JDOM:JDOM的目的是成为 Java 特定文档模型,他简化和 XML 的交互并且比使用 DOM 实现更快。
4.DOM4J:DOM4J 是很优秀的Java XML API,具备性能优异、功能强大和极端易用使用的特点,同时他也是个开放源代码的软件。如今越来越多的 Java 软件都在使用 DOM4J 来读写 XML

以上可以看出DOM4J解析技术的巨大优势了!

Document对象相关
1.读取XML文件,获得document对象.             
                   SAXReader reader = new SAXReader();         

                   Document   document = reader.read(new File("input.xml"));

2.解析XML形式的文本,得到document对象.
                   String text = "<members></members>";           

                   Document document = DocumentHelper.parseText(text);

3.主动创建document对象.
                  Document document = DocumentHelper.createDocument();  //创建根节点
                  Element root = document.addElement("members");

节点相关
1.获取文档的根节点.
      Element rootElm = document.getRootElement();

2.取得某节点的单个子节点.
     //"member"是节点名
     Element memberElm=root.element("member");

3.取得节点的文字
      String text=memberElm.getText();

      也可以:
      //这个是取得根节点下的name字节点的文字.
      String text=root.elementText("name");


4.取得某节点下名为"member"的所有字节点并进行遍历. 

List nodes = rootElm.elements("member");

for (Iterator it = nodes.iterator(); it.hasNext();) { 

                 Element elm = (Element) it.next();

                // do something

}

5.对某节点下的所有子节点进行遍历.    

for(Iterator it=root.elementIterator();it.hasNext();){

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

      // do something   

}

6.在某节点下添加子节点.Element ageElm = newMemberElm.addElement("age");
7.设置节点文字.ageElm.setText("29");

8.删除某节点.//childElm是待删除的节点,parentElm是其父节点
    parentElm.remove(childElm);
9.添加一个CDATA节点.

Element contentElm = infoElm.addElement("content");

contentElm.addCDATA(diary.getContent());
属性相关
1.取得某节点下的某属性   Element root=document.getRootElement();       //属性名name
                         Attribute attribute=root.attribute("size");
2.取得属性的文字    String text=attribute.getText();
也可以://这个是取得根节点下name字节点的属性firstname的值.
    String text2=root.element("name").attributeValue("firstname");
3.遍历某节点的所有属性   Element root=document.getRootElement();   

for(Iterator it=root.attributeIterator();

           it.hasNext();){        

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

        String text=attribute.getText();        

        System.out.println(text);   }

4.设置某节点的属性和文字. newMemberElm.addAttribute("name", "sitinspring");

5.设置属性的文字.  Attribute attribute=root.attribute("name");   

                   attribute.setText("sitinspring");
6.删除某属性   //属性名name
     Attribute attribute=root.attribute("size"); root.remove(attribute);

将文档写入XML文件
1.文档中全为英文,不设置编码,直接写入的形式.

XMLWriter writer = new XMLWriter(new  FileWriter("output.xml")); 

 writer.write(document);

 writer.close();

2.文档中含有中文,设置编码格式写入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码                   

format.setEncoding("GBK");       

XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);

writer.write(document);

writer.close();

 

现在就Dom4j解析xml的一些语法做出例子分析;先通过写一个类将上篇的xml文件解析出来。            package cn.itcast.dom4j;

import java.io.File;
import java.util.Iterator;
import java.util.List;

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

//1. 将 dom4j.jar 文件加入到当前 Java 工程的 classPath 下
public class HelloDom4j {

 public static void main(String[] args) throws DocumentException {
  //2. 在 Dom4j 中, xml 文档对应 Document 对象
  
  //a. 得到 xml 文档代表的 Document 对象
  Document document = null;
  File file = null;
  
  file = new File("customers.xml");
        SAXReader reader = new SAXReader();
        document = reader.read(file);
       
        //System.out.println(document);
       
        //b. 得到 xml 文档的根元素
        Element root = ()document.getRootElement;
        String rootName = root.getName();
        //System.out.println("rootName: " + rootName);
        System.out.println("<" + rootName + ">");
       
        //c. 得到根结点的所有子节点
        List<Element> rootChildren = null;
        rootChildren = root.elements();
        //System.out.println("rootChildren.size: " + rootChildren.size());
       
        //d. 对所有的子节点进行遍历
        for(int i = 0; i < rootChildren.size(); i++){
         Element customerEle = rootChildren.get(i);
         //System.out.println(customerEle.getName());
         System.out.println("\t<" + customerEle.getName() + ">");
         
         Iterator<Element> it = customerEle.elementIterator();
         while(it.hasNext()){
          Element ele = it.next();
          //System.out.println(ele.getName());
          //得到元素的名字
          String eleName = ele.getName();
          //得到元素的文本值
          String eleText = ele.getText();
          
          System.out.println("\t\t<" + eleName + ">" +
            eleText +
            "</" + eleName + ">");
         }
         
         System.out.println("\t</" + customerEle.getName() + ">");
        }
       
        System.out.println("</" + rootName + ">");
 }

}

     最后运行的结果也就是上篇的xml文档。体会:在这个类中,我们不难发现,在解析文档的时候是根据xml的树结构进行解析的,而不是杂乱的。这个类中的四 个步骤将是以后的增,改,删的基本步骤!其实能够深刻的理解这一思想,我们也就不难理解Dom4j解析xml的真正原理,在以后的WEB开发中用起来会如 鱼的水!

现在再看下增加属性值及文本值的一个例子:

package cn.itcast.dom4j;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

//任务:为 customers.xml 文档的 id = 102 的 Customer 节点添加一个 address 子节点<address>Shanghai</address>
public class InsertElement {

 public static void main(String[] args) throws DocumentException, IOException {
  // TODO Auto-generated method stub
  //1. 得到 customers.xml 代表的 Document 对象
  SAXReader reader = null;
  File file = null;
  Document document = null;
  
  reader = new SAXReader();
  file = new File("customers.xml");
  document = reader.read(file);
  
  //2. 得到 id = 102 的 Customer 节点
  Element custEle = null;
  
  List<Attribute> idAttrs = document.selectNodes("//customers/customer/@id ");
  for(int i = 0; i < idAttrs.size(); i++){
   String idValue = idAttrs.get(i).getValue();
   if(idValue != null && idValue.equals("102")){
    custEle = idAttrs.get(i).getParent();
   }
  }
  
  System.out.println(custEle);
  
  //3. 为 custEle 添加一个子节点: <address></address>
  Element address = custEle.addElement("address");
  //4. 设置该节点的文本值
  address.setText("Shanghai");
  //4.1 设置子节点的属性
  address.addAttribute("id", "021");
  
  //5. 把更新后的 Document 对象写入到 customers.xml 文件中
  
  //5.1设置输出方式, 获取 OutputFormat 对象
  OutputFormat format = OutputFormat.createPrettyPrint();
  format.setEncoding("GB2312");
  //5.2 获取 XMLWriter 对象
  XMLWriter writer = new XMLWriter(new FileWriter( "customers.xml" ), format);
  //5.2 写入到文件中
        writer.write(document);
        //5.4 关闭 io 流
        writer.close();
       
      
 }

}

<customers>
  <customer id="103" sex="m">
   <name xmlns="Bob" />
   <age xmlns="32" />
   <email xmlns=" [email protected] " />
  </customer>
  <customer id="102" sex="f">
   <name xmlns="Jerry" />
   <age xmlns="22" />
   <email xmlns=" [email protected] " />
       <address id="021">Shanghai</address>    //这句为添加的句子
  </customer>
</customers>
    在这个例题中,最关键的一点就是第5步骤,把更新后的 Document 对象写入到 customers.xml 文件中的几种方法。还有个注意点就是在用到流写入文件的时候一定要用write.close();将流关闭!通过这个例子可以看出,删除,修改等等,只要理解其方法,这些类就并不难写!

http://blog.sina.com.cn/s/blog_5ecfe46a0100ckhj.html~type=v5_one&label=rela_nextarticle


你可能感兴趣的:(数据结构,编程,xml,框架,ssh)