dom4j

前提:需要将dom4j-1.6.1.jar包加入到工程(WEB-INF\lib路径下)。

★     Document对象
1、  读取XML文件,形成Document对象:
         SAXReader reader = new SAXReader() ;
         Document doc = reader.read(new File(“input.xml”)) ;

2、  解析XML文本,得到Document对象:
         String text = “<members></members>” ;
         Document doc = DocumentHelper.parseText(text) ;

3、  主动创建:
         Document doc = DocumentHelper.createDocument() ;
         Element root = doc.addElement(“members”) ; //创建根节点;

总结:SAXReader接口:读取已经存在的XML文件;
         一个方法read():读取文件形成Document对象。
             DocumentHelper接口:分析程序中XML形式的文本或主动创建Document对象;
                 parseText():解析现有的XML文本段并生产Document对象;
                 createDocument():创建一个Document对象。
★     节点实际上是元素吧
学习节点的操作前应该明白两点:节点是在Document对象的基础上进行操作的;
节点分为根节点和普通节点。要进行操作先要获得根节点(root)。
1、  对于根节点
获得节点:getRootElement() ;

2、  对于一般节点
取得某节点的子节点:
         Element child = root.element(“members”) ; //取得名为members的节点;
取得节点的文字:
         String text = child.getText() ; //child是上述取出的节点名;
或者使用下述方法:
   root.elementText(“name”) ; //取得节点名称为name的文本;

3、  遍历
·取得某个节点下的名为“member”的所有节点:
         List nodes = rootElm.elements(“member”) ;
         for(Iterator it = nodes.iterator();it.hasNext();){Element elm = (Element)it.next() ;}
·对某节点下的所有子节点的遍历
         for(Iterator it = root.elementIterator();it.hasNext();){
   Element elm = (Element)it.next() ;
}
两个程序段中,rootElm(document.getRootElement()得到)与root是一回事吗?

4、  节点的增删
·增加节点
         Element newChild = existParent.addElement(“name”) ;
·增加节点的文字
         newChild.setText(“lsl”) ;
·删除节点
         parentElm.remove(childElm) ;

★     属性
1、  取得某个节点的属性
         Element root = document.getRootElement() ;
         Attribute attr = root.attribute(“size”) ;

2、  取得属性的文字
         String text = attr.getText() ;
也可用下面的方法
         //取得根节点下name子节点的属性firstname的值
String text = root.element(“name”).attributeValue(“firstname”) ;

3、  遍历
         Element root = document.getRootElement() ;
         for(Iterator it = root.attributeIterator();it.hasNext();){
   Attribute attr = (Attribute)it.next() ;
   String text = attr.getText() ;
}

4、  增删
·增加属性
         newElm.addAttribute(“name”,”lsl”) ;//给新阶段添加新属性name值为lsl;
·只增加属性的值
         Attribute attr = root.attribute(“name”) ;//取得已存在的属性name;
         attr.setText(“lsl”) ; //将值设为lsl
·删除属性
         Attribute attr = root.attribute(“size”) ; //取得一个已存在的属性
         root.remove(attr) ; //删除属性
通过对节点和属性的学习可以看出,对XML的操作基本上是 XML文件à document对象à root(根节点)。对于节点和属性的增删操作都是在root上进行的。

★     将文档写入XML文件
1、  不需要设置格式,直接输出
         XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”)) ;
         writer.write(document) ;
         writer.close() ;

2、  当需要设置编码时,用到OutputFormat类
         OutputFormat format = OutputFormat.createPrettyPrint() ;
         format.setEncoding(“GBK”) ; //设置编码格式

         XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”),format) ;
         … …


★     字符串与XML的转换
1.     将字符串转化为XML
       String text = “<members><member>sitinspring</member></members>” ;
                 Document document = DocumentHelper.parseText(text);

2.     将文档或节点的XML转化为字符串
       SAXReader reader = new SAXReader();
       Document   document = reader.read(new File("input.xml"));            
       Element root=document.getRootElement();                
       String docXmlText=document.asXML();
       String rootXmlText=root.asXML();
       Element memberElm=root.element("member");
       String memberXmlText=memberElm.asXML();

★     实例代码
1、  创建XML(CreatXML.java)
package com.dom4j.lsl;

import java.io.File;
import java.io.FileWriter;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class CreateXML {

       /**
         * @param args
         */
       public void createXML(String filename) {
         //Create the Documetn object;
         Document doc = DocumentHelper.createDocument() ;
         //add the root element
         Element books = doc.addElement("BOOKS") ;
         //add comments
         books.addComment("这是一个关于Dom4j的测试程序,用于生成一个XML文件") ;
        
         //add the first child element
         Element book = books.addElement("BOOK") ;
         //add attribute
         book.addAttribute("show","yes") ;
         Element title = book.addElement("TITLE") ;
         //add the text
         title.setText("玉女心经") ;
        
         Element owner = books.addElement("OWNER") ;
        
         try{
             OutputFormat format = OutputFormat.createPrettyPrint() ;
            
             XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format) ;
             writer.write(doc) ;
             writer.close() ;
         }catch(Exception e){
             e.printStackTrace() ;
         }
        
       }
       public static void main(String[] args) {
         // TODO Auto-generated method stub
         //Output the XML file
         CreateXML cx = new CreateXML() ;
         cx.createXML("E://test.xml") ;
       }

}

2、  解析XML(ParseXML.java)
package com.dom4j.lsl;

import java.io.File;

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

public class ParseXML {

       /**
         * @param args
         * @throws DocumentException
         *
         * 用于试验的文件如下:
         * -------------------
         * <?xml version="1.0" encoding="UTF-8"?>
         *<BOOKS>
         *   <BOOK show="yes">
         *     <TITLE>AAA</TITLE>
         *   </BOOK>
         *   <OWNER/>
*</BOOKS>
         *--------------------
         */
       public static void main(String[] args) throws DocumentException {
         /**
         * 关于 Element 的测试;
         *
         * getRootElemt()   获得 根节点
         * elementText()   父节点调用,返回子节点的内容 等同于getText()方法
         * element(arg)   获取 arg 指定的节点
         */
         SAXReader reader = new SAXReader() ;
         Document doc = reader.read(new File("E://test.xml")) ;
         Element root = doc.getRootElement() ;
         Element child = root.element("BOOK") ;
         Element gradChild = child.element("TITLE") ;
         /**
         * 元素只能由其父元素调用element()方法得到,不能隔代选取
         * 如下是错误的
         * Element gradChild1 = root.element("TITLE") ;
         * 而如下语句
         * String gradChildText = root.elementText("TITLE") ;
         * 则返回null,不报错.
         */
                
         //测试方法elementText();
         String gradChildText = child.elementText("TITLE") ;
         String gradChildText1 = gradChild.asXML();  
         String gradChildText2 = gradChild.getText() ;
         /**
         * 以下用于 Attribute 的测试;
         *
         * attribute()   获取属性对象
         * arributeValue(arg)   获取arg指示的属性的值 类似与eleentText()吧
         * asXML()   将 节点或属性 转换成可以输出的字符串形式;
         * getText() 获取属性或节点的值;
         */
         Attribute childAttr = child.attribute("show") ;
         String attrText = childAttr.asXML() ;
         String attrText1 = childAttr.getText() ;
         String attrText2 = child.attributeValue("show") ;
        
         /**
         * 以下代码用于输出结果
         */
         System.out.println(gradChildText) ;
         System.out.println(gradChildText1) ;
         System.out.println(gradChildText2) ;
        
         System.out.println(attrText) ;
         System.out.println(attrText1) ;
         System.out.println(attrText2) ;
        
         /**
         * 关于XML的简单应用
         */
         String show ;
         show = attrText1 ;
         if(show.equals("yes")){
             System.out.println("元素<BOOK>的show属性的值是yes!") ;
         }
        
       }

}

你可能感兴趣的:(xml)