Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3506660
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2006-09-08 10:30:28

/**
 *
 */

//文件包
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;
/**
 * @author lgr
 *
 */
public class OperateXML {

    public OperateXML(){}
    
    /**
     *    说明:
        Document document = DocumentHelper.createDocument();
        通过这句定义一个XML文档对象。
       
        Element booksElement = document.addElement("books");
        通过这句定义一个XML元素,这里添加的是根节点。
       
        Element有几个重要的方法:
            l. addComment:添加注释
            2. addAttribute:添加属性
             3. addElement:添加子元素

        最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,
        可以通过OutputFormat类的 createCompactFormat()方法或createPrettyPrint()方法格式化输出,
        默认采用 createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。
     */
   
    /**
    * 建立一个XML文档,文档名由输入属性决定
    * @param filename 需建立的文件名
    * @return 返回操作结果, false 表失败, true 表成功
    */
    public boolean createXMLFile(String filename){
       
        boolean flag = true;
       
        /** 建立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();
           
        }catch(Exception ex){
            flag = false;
            ex.printStackTrace();
        }

        return flag;

    }

    /**
     *     说明:
        List list = document.selectNodes("/books/book/@show" );
        list = document.selectNodes("/books/book");
        上述代码通过xpath查找到相应内容。
        通过setValue()、setText()修改节点内容。
        通过remove()删除节点或属性。
     */
   
    /**
    * 修改XML文件中内容,并另存为一个新文件
    * 重点掌握dom4j中如何添加节点,修改节点,删除节点
    * @param filename 修改对象文件
    * @param newfilename 修改后另存为该文件
    * @return 返回操作结果, 0表失败, 1表成功
    */
   
    public boolean ModiXMLFile(String filename,String newfilename){
       
        boolean flag = true;
       
        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();

            }catch(Exception ex){
                flag = false;
                ex.printStackTrace();
            }
       
        }catch(Exception ex){
            flag = false;
            ex.printStackTrace();
        }
           
        return flag;
    }

    /**
     *     说明:
        OutputFormat format = OutputFormat.createPrettyPrint();

        这句指定了格式化的方式为缩进式,则非紧凑式。
        format.setEncoding("GBK");
        指定编码为GBK。

        XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
        这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
     */
   
    /**
    * 格式化XML文档,并解决中文问题
    * @param filename
    * @return
    */

    public boolean formatXMLFile(String filename){
       
        boolean flag = true;
       
        try{

            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(new File(filename));
            XMLWriter writer = null;

            /** 格式化输出,类型IE浏览一样 */
            OutputFormat format = OutputFormat.createPrettyPrint();

            /** 指定XML编码 */
            format.setEncoding("GBK");

            writer= new XMLWriter(new FileWriter(new File(filename)),format);
            writer.write(document);
            writer.close();
       
        }catch(Exception ex){
            flag = false;
            ex.printStackTrace();
        }
       
        return flag;
       
    }
   
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        OperateXML temp = new OperateXML();

        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"));

    }

}
 
阅读(1452) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~