posts - 0,  comments - 1,  trackbacks - 0

DOM4J解析xml文件-dom4j-Java源代码

作者:dsafdfgdhtrewgfdhrrw     文章来源:互联网    上传日期:2007-12-11

       虽然DOM4J 代表了完全独立的开发结果,但最初,它是JDOM 的一种智能分支。它合并了许多超出基本XML 文档表示的功能,包括集成的XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 DOM4J API 和标准DOM 接口具有并行访问功能。从 2000 下半年开始,它就一直处于开发之中。

  为支持所有这些功能,DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然 DOM4J 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。
  在添加灵活性、XPath 集成和对大文档处理的目标时,DOM4J 的目标与 JDOM 是一样的:针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案,实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时,它比 JDOM 更少强调防止不正确的应用程序行为。
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
注意:
dom4j1.6解压后有一个dom4j-1.6.1.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-6.jarr文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
举例说明:
创建一个emps.xml文档
package com.xml;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4JXML {
   
    public void createXML() {
        //用工厂类创建一个document实例
        Document doc = DocumentHelper.createDocument();
        //创建根元素emps
        Element rootEle = doc.addElement("emps");
        //添加注释
        rootEle.addComment("这是一个dom4j生成的xml文件");
        //emps根节点下创建一个emp节点
        Element empEle = rootEle.addElement("emp");
        //emp添加属性id="1"
        empEle.addAttribute("id", "1");
        //emp节点下创建一个name节点
        Element nameEle = empEle.addElement("name");
        //name节点下创建一个文本节点zhangsan
        nameEle.setText("zhangsan");
        //再为name节点创建一个兄弟节点
        Element sexEle = empEle.addElement("sex");
        sexEle.setText("man");
        //将document中的内容写入文件中
        try {
            Writer out = new FileWriter("F:\\emps.xml");
            //格式化输出,类型IE浏览一样
            OutputFormat format = OutputFormat.createPrettyPrint();
            //OutputFormat format = OutputFormat.createCompactFormat();
            format.setEncoding("UTF-8");
//创建写出对象
            XMLWriter writer = new XMLWriter(out,format);
            writer.write(doc);
            writer.close();
            System.out.println("生成emps.xml成功。");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("失败了。");
        }
    }
    public static void main(String[] args) {
        new Dom4JXML().createXML();
    }
}
文档内容:
       <?xml version="1.0" encoding="UTF-8"?>
<emps>
<!--这是一个dom4j生成的xml文件-->
<emp id="1">
    <name>zhangsan</name>
    <sex>man</sex>
</emp>
</emps>
将创建的emps.xml文档修改生成emps(update).xml
1. emp属性id 修改为:001
2. name中的文本修改为:张三
3. 删除emp下的sex属性
package com.xml;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4JXML {
   
    publicvoid updateXML(){
        try {
            //创建读入对象
            SAXReader reader = new SAXReader();
            //创建document实例
            Document doc = reader.read("F:\\emps.xml");
            //查找节点emp下的id属性
            List listAttr = doc.selectNodes("/emps/emp/@id");
            Iterator itAttr = listAttr.iterator();
            while(itAttr.hasNext()){
                Attribute attr = (Attribute) itAttr.next();
                //emp属性修改为001
                attr.setValue("001");
            }
            //查找emp下的name节点
            List listText = doc.selectNodes("/emps/emp/name");
            Iterator itText = listText.iterator();
            while(itText.hasNext()){
                Element textEle = (Element) itText.next();
                //name节点的文本内容修改为"张三"
                textEle.setText("张三");
            }
            //查找emp节点
            List listEle = doc.selectNodes("/emps/emp");
            Iterator itEle = listEle.iterator();
            while(itEle.hasNext()){
                Element empEle = (Element) itEle.next();
                //查找emp下的sex节点
                Iterator itSex = empEle.elementIterator("sex");
                while(itSex.hasNext()){
                    Element sexEle = (Element) itSex.next();
                    //删除sex节点
                    empEle.remove(sexEle);
                }
            }
            //创建写出流
            Writer out = new FileWriter("F:\\emps(update).xml");
            // 格式化输出
            OutputFormat format = OutputFormat.createPrettyPrint();
            //OutputFormat format = OutputFormat.createCompactFormat();
            format.setEncoding("UTF-8");
            //创建写出对象
            XMLWriter writer = new XMLWriter(out,format);
            writer.write(doc);
            writer.close();
            System.out.println("生成emps(update).xml成功。");
           
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }
    public static void main(String[] args) {
        new Dom4JXML().updateXML();
    }
}
















需要导入的包有两个:dom4j-1.6.1.jar    jaxen-1.1-beta-6.jar

源代码:

package com.bling;

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

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

public class CreateXml {

//*************第一个任务:建立一个xml文档***************************
public int createXml(String filename) {
   int createValue = 0;
   // 建立document对象
   Document document = DocumentHelper.createDocument();
   // 建立xml文档的根节点books
   Element booksElement = document.addElement("books");
   // 添加一行注释
   booksElement.addComment("this is a test");
   // 添加第一个book节点
   Element bookElement = booksElement.addElement("book");
   // 加入第一个book的show属性和它的值
   bookElement.addAttribute("show", "yes");
   // 加入title节点
   Element titleElement = bookElement.addElement("title");
   // 为title设置值
   titleElement.setText("jsp");

   // 接下来添加两个类似的book

   // 第一本
   bookElement = booksElement.addElement("book");
   bookElement.addAttribute("show", "yes");
   titleElement = bookElement.addElement("title");
   titleElement.setText("java");

   // 第二本
   bookElement = booksElement.addElement("book");
   bookElement.addAttribute("show", "no");
   titleElement = bookElement.addElement("title");
   titleElement.setText("mvc");

   // 加入owner节点
   Element ownerElement = booksElement.addElement("owner");
   ownerElement.setText("bling");

   // 将document里面的内容写入文件中
   try {
    XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
    writer.write(document);
    writer.close();
    createValue = 1;
   } catch (IOException e) {
    e.printStackTrace();
   }
   return createValue;
}

//*************第二个任务修改创建的xml*****************************
//1. 修改xml文件中的指定内容并且另存为一个新文件
//2. 重点掌握dom4j中如何添加节点,修改节点,删除节点
//3. 更改要求:①如果book节点中的show属性为yes则改为no
//    ②把owner项内容修改为“漫步云端”
//    ③若title的内容为“java程序设计”,则删除该节点

public int ModifyXml(String filename,String newfilename){
   int modifyValue=0;
  
   SAXReader saxreader = new SAXReader();
   try {
    Document document=saxreader.read(new File(filename));
    //修改第一个要求
    //先用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节点处加入date节点,date节点的内容为2008-08-08,还为date基点添加一个属性type
    list = document.selectNodes("/books/owner");
    iter= list.iterator();
    if (iter.hasNext()){
     Element ownerElement = (Element)iter.next();
     ownerElement.setText("manbusky");
     Element dateElement = ownerElement.addElement("date");
     dateElement.setText("2008-08-08");
     dateElement.addElement("type","the olmypic");
    }
   
    //修改第三个要求
    list = document.selectNodes("/books/book");
    iter = list.iterator();
    while (iter.hasNext()){
     Element bookElement = (Element)iter.next();
     Iterator it = bookElement.elementIterator("title");
     while (it.hasNext()){
      Element titleElement = (Element)it.next();
      if (titleElement.getText().equals("java")){
       bookElement.remove(titleElement);
      }
     }
    }
   
    //将更改之后的文件写入
    XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
    writer.write(document);
    writer.close();
    modifyValue=1;
   } catch (DocumentException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
   return modifyValue;
}


//第三个任务。格式化输出和设定编码

public int formatXml(String filename){
   int formatValue=0;
  
   SAXReader saxreader = new SAXReader();
   try {
    Document document = saxreader.read(new File(filename));
    XMLWriter writer=null;
    //格式化右缩进的那种
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("UTF-8");
    writer = new XMLWriter(new FileWriter(new File(filename)),format);
    writer.write(document);
    writer.close();
    formatValue=1;
   
   } catch (DocumentException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  
  
   return formatValue;
}


public static void main(String[] args) {
  
   CreateXml xml=new CreateXml();
  
   //任务一
   int i=xml.createXml("test.xml");
   System.out.println(i);
   System.out.println("执行任务一,创建xml");
  
   //中间需要格式化一下
   int k=xml.formatXml("test.xml");
   System.out.println(k);
   System.out.println("格式化代码");
  
   //任务二
   int j=xml.ModifyXml("test.xml", "modyfy.xml");
   System.out.println(j);
   System.out.println("执行任务二,修改xml");
}
}

 

其实这里有一个很大的问题,我的eclipse的xml默认编码是utf-8,输出的test.xml文件的编码也是utf-8,但是不能加中文,就是加注释也是不行,加中文那样可以创建,但是在格式化和修改的时候就会抛出异常,

Invalid byte 2 of 2-byte UTF-8 sequence,不知道怎么解决,希望高手指点一下!等我自己找出来了我也在此补充一下,网上很多都都在问这个问题!迷惑啊……我靠,一个编码能搞死人!

但是在将eclipse里面的编码设为gb2312或者gbk又可以!哎……!……!……!……

posted on 2009-08-03 12:30 雨飞 阅读(307) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿

文章档案

搜索

  •  

最新评论