Java操作XML文件 dom4j 篇

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互。
今天就来讲一下Java 中使用dom4j来操作XML文件。

我们需要引入的包:
/文件包 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileWriter; 
//工具包 
import java.util.Iterator; 
import java.util.List; 
//dom4j包 
import org.dom4j.Attribute; 
import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.Element; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.SAXReader; 
import org.dom4j.io.XMLWriter;

1、将XML文件的内容转化为String

    /** 
     * doc2String 
     * 将xml文档内容转为String 
     * @return 字符串 
     * @param document 
     */
 
    public  static  String doc2String(Document document) 
    { 
       String s =  ""
       try 
       { 
            //使用输出流来进行转化 
            ByteArrayOutputStream out =  new ByteArrayOutputStream(); 
            //使用GB2312编码 
            OutputFormat format =  new OutputFormat( "   ", true,  "GB2312"); 
            XMLWriter writer =  new XMLWriter(out, format); 
            writer.write(document); 
            s = out. toString( "GB2312"); 
       } catch( Exception ex) 
       {             
            ex.printStackTrace(); 
       }       
       return s; 
    }

2、将符合XML格式的String 转化为XML Document

    /** 
     * string2Document 
     * 将字符串转为Document 
     * @return 
     * @param s xml格式的字符串 
     */
 
    public  static Document string2Document( String s) 
    { 
       Document doc = null; 
       try 
       { 
            doc = DocumentHelper.parseText(s); 
       } catch( Exception ex) 
       {             
            ex.printStackTrace(); 
       } 
       return doc; 
    }

3、将Document对象保存为一个xml文件到本地

    /** 
     * doc2XmlFile 
     * 将Document对象保存为一个xml文件到本地 
     * @return true:保存成功   flase:失败 
     * @param filename 保存的文件名 
     * @param document 需要保存的document对象 
     */
 
    public  static  boolean doc2XmlFile(Document document, String filename) 
    { 
       boolean flag = true; 
       try 
       { 
             /* 将document中的内容写入文件中 */ 
             //默认为UTF-8格式,指定为"GB2312" 
             OutputFormat format = OutputFormat.createPrettyPrint(); 
             format.setEncoding( "GB2312"); 
             XMLWriter writer =  new XMLWriter( new FileWriter( new File(filename)),format); 
             writer.write(document); 
             writer.close();             
         } catch( Exception ex) 
         { 
             flag = false; 
             ex.printStackTrace(); 
         } 
         return flag;       
    }

4、将xml格式的字符串保存为本地文件,如果字符串格式不符合xml规则,则返回失败

    /** 
     * string2XmlFile 
     * 将xml格式的字符串保存为本地文件,如果字符串格式不符合xml规则,则返回失败 
     * @return true:保存成功   flase:失败 
     * @param filename 保存的文件名 
     * @param str 需要保存的字符串 
     */
 
    public  static  boolean string2XmlFile( String str, String filename) 
    { 
       boolean flag = true; 
       try 
       { 
          Document doc =   DocumentHelper.parseText(str);        
          flag = doc2XmlFile(doc,filename); 
       } catch ( Exception ex) 
       { 
          flag = false; 
          ex.printStackTrace(); 
       } 
       return flag; 
    }

5、载入一个xml文档

    /** 
     * load 
     * 载入一个xml文档 
     * @return 成功返回Document对象,失败返回null 
     * @param uri 文件路径 
     */
 
    public  static Document load( String filename) 
    { 
       Document document = null; 
       try 
       { 
           SAXReader saxReader =  new SAXReader(); 
           document = saxReader.read( new File(filename)); 
       } 
       catch ( Exception ex){ 
           ex.printStackTrace(); 
       }   
       return document; 
    }

6、演示String保存为xml文件

    /** 
     * xmlWriteDemoByString 
     * 演示String保存为xml文件 
     */
 
    public  void xmlWriteDemoByString() 
    { 
       String s =  ""
       /** xml格式标题 "<?xml version='1.0' encoding='GB2312'?>" 可以不用写*/ 
       s =  "<config>/r/n" 
          + "    <ftp name='DongDian'>/r/n" 
          + "      <ftp-host>127.0.0.1</ftp-host>/r/n" 
          + "      <ftp-port>21</ftp-port>/r/n" 
          + "      <ftp-user>cxl</ftp-user>/r/n" 
          + "      <ftp-pwd>longshine</ftp-pwd>/r/n" 
          + "      <!-- ftp最多尝试连接次数 -->/r/n" 
          + "      <ftp-try>50</ftp-try>/r/n" 
          + "      <!-- ftp尝试连接延迟时间 -->/r/n" 
          + "      <ftp-delay>10</ftp-delay>/r/n" 
          + "   </ftp>/r/n" 
          + "</config>/r/n"
       //将文件生成到classes文件夹所在的目录里    
       string2XmlFile(s, "xmlWriteDemoByString.xml");    
       //将文件生成到classes文件夹里    
       string2XmlFile(s, "classes/xmlWriteDemoByString.xml");   
    }

7、演示手动创建一个Document,并保存为XML文件

    /** 
     * 演示手动创建一个Document,并保存为XML文件 
     */
 
    public  void xmlWriteDemoByDocument() 
    { 
         /** 建立document对象 */ 
         Document document = DocumentHelper.createDocument(); 
         /** 建立config根节点 */ 
         Element configElement = document.addElement( "config"); 
         /** 建立ftp节点 */ 
         configElement.addComment( "东电ftp配置"); 
         Element ftpElement = configElement.addElement( "ftp"); 
         ftpElement.addAttribute( "name", "DongDian"); 
         /** ftp 属性配置 */ 
         Element hostElement = ftpElement.addElement( "ftp-host"); 
         hostElement.setText( "127.0.0.1"); 
         (ftpElement.addElement( "ftp-port")).setText( "21"); 
         (ftpElement.addElement( "ftp-user")).setText( "cxl"); 
         (ftpElement.addElement( "ftp-pwd")).setText( "longshine"); 
         ftpElement.addComment( "ftp最多尝试连接次数"); 
         (ftpElement.addElement( "ftp-try")).setText( "50"); 
         ftpElement.addComment( "ftp尝试连接延迟时间"); 
         (ftpElement.addElement( "ftp-delay")).setText( "10");     
         /** 保存Document */ 
         doc2XmlFile(document, "classes/xmlWriteDemoByDocument.xml"); 
    }

8、演示读取文件的具体某个节点的值

    /** 
     *   演示读取文件的具体某个节点的值 
     */
 
    public  static  void xmlReadDemo() 
    { 
       Document doc = load( "classes/xmlWriteDemoByDocument.xml"); 
       //Element root = doc.getRootElement(); 
       /** 先用xpath查找所有ftp节点 并输出它的name属性值*/ 
       List list = doc.selectNodes( "/config/ftp" ); 
       Iterator it = list.iterator(); 
       while(it.hasNext()) 
       {    
           Element ftpElement = (Element)it.next(); 
           System.out.println( "ftp_name="+ftpElement.attribute( "name").getValue()); 
       } 
       /** 直接用属性path取得name值 */ 
       list = doc.selectNodes( "/config/ftp/@name" ); 
       it = list.iterator(); 
       while(it.hasNext()) 
       {    
           Attribute attribute = (Attribute)it.next(); 
           System.out.println( "@name="+attribute.getValue()); 
       } 
       /** 直接取得DongDian ftp的 ftp-host 的值 */ 
       list = doc.selectNodes( "/config/ftp/ftp-host" ); 
       it = list.iterator(); 
       Element hostElement=(Element)it.next(); 
       System.out.println( "DongDian's ftp_host="+hostElement.getText()); 
    }

 参考代码:

package  com.holen.dom4j;

import  java.io.File;

import  java.io.FileWriter;

import  java.util.Iterator;

import  java.util.List;

import  org.dom4j.Attribute;

import  org.dom4j.Document;

import  org.dom4j.DocumentHelper;

import  org.dom4j.Element;

import  org.dom4j.io.OutputFormat;

import  org.dom4j.io.SAXReader;

import  org.dom4j.io.XMLWriter;

/**
 * 
 * 
@author  Holen Chen
 * 
 
*/

public   class  Dom4jDemo {

    
public  Dom4jDemo() {

    }

    
/**
     * 
     * 建立一个XML文档,文档名由输入参数决定
     * 
     * 
@param  filename
     *            需建立的文件名
     * 
     * 
@return  返回操作结果, 0表失败, 1表成功
     * 
     
*/

    
public   int  createXMLFile(String filename) {

        
/**  返回操作结果, 0表失败, 1表成功  */

        
int  returnValue  =   0 ;

        
/**  建立document对象  */

        Document document 
=  DocumentHelper.createDocument();

        
/**  建立XML文档的根books  */

        Element booksElement 
=  document.addElement( " books " );

        
/**  加入一行注释  */

        booksElement.addComment(
" This is a test for dom4j, holen, 2004.9.11 " );

        
/**  加入第一个book节点  */

        Element bookElement 
=  booksElement.addElement( " book " );

        
/**  加入show参数内容  */

        bookElement.addAttribute(
" show " " yes " );

        
/**  加入title节点  */

        Element titleElement 
=  bookElement.addElement( " title " );

        
/**  为title设置内容  */

        titleElement.setText(
" Dom4j Tutorials " );

        
/**  类似的完成后两个book  */

        bookElement 
=  booksElement.addElement( " book " );

        bookElement.addAttribute(
" show " " yes " );

        titleElement 
=  bookElement.addElement( " title " );

        titleElement.setText(
" Lucene Studing " );

        bookElement 
=  booksElement.addElement( " book " );

        bookElement.addAttribute(
" show " " no " );

        titleElement 
=  bookElement.addElement( " title " );

        titleElement.setText(
" Lucene in Action " );

        
/**  加入owner节点  */

        Element ownerElement 
=  booksElement.addElement( " owner " );

        ownerElement.setText(
" O'Reilly " );

        
try  {

            
/**  将document中的内容写入文件中  */

            XMLWriter writer 
=   new  XMLWriter( new  FileWriter( new  File(filename)));

            writer.write(document);

            writer.close();

            
/**  执行成功,需返回1  */

            returnValue 
=   1 ;

        } 
catch  (Exception ex) {

            ex.printStackTrace();

        }

        
return  returnValue;

    }

    
/**
     * 
     * 修改XML文件中内容,并另存为一个新文件
     * 
     * 重点掌握dom4j中如何添加节点,修改节点,删除节点
     * 
     * 
@param  filename
     *            修改对象文件
     * 
     * 
@param  newfilename
     *            修改后另存为该文件
     * 
     * 
@return  返回操作结果, 0表失败, 1表成功
     * 
     
*/

    
public   int  ModiXMLFile(String filename, String newfilename) {

        
int  returnValue  =   0 ;

        
try  {

            SAXReader saxReader 
=   new  SAXReader();

            Document document 
=  saxReader.read( new  File(filename));

            
/**  修改内容之一:如果book节点中show参数的内容为yes,则修改成no  */

            
/**  先用xpath查找对象  */

            List list 
=  document.selectNodes( " /books/book/@show " );

            Iterator iter 
=  list.iterator();

            
while  (iter.hasNext()) {

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

                
if  (attribute.getValue().equals( " yes " )) {

                    attribute.setValue(
" no " );

                }

            }

            
/**
             * 
             * 修改内容之二:把owner项内容改为Tshinghua
             * 
             * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个参数type
             * 
             
*/

            list 
=  document.selectNodes( " /books/owner " );

            iter 
=  list.iterator();

            
if  (iter.hasNext()) {

                Element ownerElement 
=  (Element) iter.next();

                ownerElement.setText(
" Tshinghua " );

                Element dateElement 
=  ownerElement.addElement( " date " );

                dateElement.setText(
" 2004-09-11 " );

                dateElement.addAttribute(
" type " " Gregorian calendar " );

            }

            
/**  修改内容之三:若title内容为Dom4j Tutorials,则删除该节点  */

            list 
=  document.selectNodes( " /books/book " );

            iter 
=  list.iterator();

            
while  (iter.hasNext()) {

                Element bookElement 
=  (Element) iter.next();

                Iterator iterator 
=  bookElement.elementIterator( " title " );

                
while  (iterator.hasNext()) {

                    Element titleElement 
=  (Element) iterator.next();

                    
if  (titleElement.getText().equals( " Dom4j Tutorials " )) {

                        bookElement.remove(titleElement);

                    }

                }

            }

            
try  {

                
/**  将document中的内容写入文件中  */

                XMLWriter writer 
=   new  XMLWriter( new  FileWriter( new  File(
                        newfilename)));

                writer.write(document);

                writer.close();

                
/**  执行成功,需返回1  */

                returnValue 
=   1 ;

            } 
catch  (Exception ex) {

                ex.printStackTrace();

            }

        } 
catch  (Exception ex) {

            ex.printStackTrace();

        }

        
return  returnValue;

    }

    
/**
     * 
     * 格式化XML文档,并解决中文问题
     * 
     * 
@param  filename
     * 
     * 
@return
     * 
     
*/

    
public   int  formatXMLFile(String filename) {

        
int  returnValue  =   0 ;

        
try  {

            SAXReader saxReader 
=   new  SAXReader();

            Document document 
=  saxReader.read( new  File(filename));

            XMLWriter output 
=   null ;

            
/**  格式化输出,类型IE浏览一样  */

            OutputFormat format 
=  OutputFormat.createPrettyPrint();

            
/**  指定XML字符集编码  */

            format.setEncoding(
" GBK " );

            output 
=   new  XMLWriter( new  FileWriter( new  File(filename)), format);

            output.write(document);

            output.close();

            
/**  执行成功,需返回1  */

            returnValue 
=   1 ;

        } 
catch  (Exception ex) {

            ex.printStackTrace();

        }

        
return  returnValue;

    }

    
public   static   void  main(String[] args) {

        Dom4jDemo temp 
=   new  Dom4jDemo();

        System.out.println(temp.createXMLFile(
" d://holen.xml " ));

        System.out.println(temp.ModiXMLFile(
" d://holen.xml " " d://holen2.xml " ));

        System.out.println(temp.formatXMLFile(
" d://holen2.xml " ));

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值