学习使用dom4j中,找了网络上的例子开始遇到些问题
1 载了dom4j.zip下来,一般要引入两个jar包,一个自然是dom4j-1.6.1.jar,另外一个是jaxen-1.1-beta-6.jar,不引的话会报一个java.lang.NoClassDefFoundError: org/jaxen/JaxenException
2 网络上找的这个例子简单明了,不过有个中文问题,研究了一下解决了
java 代码
- package util;
- import java.io.*;
- import java.util.*;
- import org.dom4j.*;
- import org.dom4j.io.*;
- public class Xmldo {
- public static void main(String[] args) {
- createXMLFile("E:/1.xml");
- formatXMLFile("E:/1.xml");
- }
- public static void getTestXML(){
- }
- public static int createXMLFile(String filename){
- 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");
- document.setXMLEncoding("UTF-8");
- try{
- /** 将document中的内容写入文件中 */
- //XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
- //换成下面的方法,才会生成UTF-8格式的xml文件,不能读的时候会报错
- //org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence.
- XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filename),"UTF-8"));
- 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)));
- //换成下面的方法
- XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(newfilename),"UTF-8"));
- 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 static int formatXMLFile(String filename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- //假如read的格式不是utf-8的,下面这句就报错Invalid byte 2 of 2-byte UTF-8 sequence
- Document document = saxReader.read(new File(filename));
- XMLWriter writer = null;
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("UTF-8");
- //writer= new XMLWriter(new FileWriter(new File(filename)),format);
- //换成下面的方法
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename),"UTF-8");
- writer= new XMLWriter(osw,format);
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
- }