dom4j的小例子

1.要解析的xml文件book.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="book1">
		<title>JAVA编程思想</title>
		<price>80.00</price>
	</book>
	<book id="book2">
		<title>JAVA核心技术</title>
		<price>100.00</price>
	</book>
</books>

2.解析xml文件

package com.chen.dom;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
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;
import org.junit.Test;

public class Dom4jTest {
    @Test
    public void read() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("resource/book.xml"));
        Element root = document.getRootElement();
        Element book1 = (Element) root.elements("book").get(0);
        String id1 = book1.attributeValue("id");
        String titleText = book1.element("title").getTextTrim();
        System.out.println(id1 + "---" + titleText);
    }

    /*
     * 将整个xml使用递归完整输出
     */
    @Test
    public void readIterator() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("resource/book.xml"));
        Element root = document.getRootElement();
        // 递归解析xml
        parse(root);

    }

    // 递归解析xml
    public void parse(Element element) {
        System.out.print("<" + element.getName());
        // 遍历节点的属性
        List<Attribute> attributes = element.attributes();
        for (int i = 0; i < attributes.size(); i++) {
            Attribute attr = attributes.get(i);
            String name = attr.getName();
            String value = attr.getValue();
            System.out.print(" " + name + "=\"" + value + "\"");
        }
        System.out.println(">");
        // 获取节点的文本信息
        if (element.getTextTrim() != null && !"".equals(element.getTextTrim())) {
            System.out.println(element.getTextTrim());
        }
        // 对该节点进行递归
        for (Iterator i = element.elementIterator(); i.hasNext();) {
            parse((Element) i.next());
        }
        System.out.println("</" + element.getName() + ">");
    }

    @Test
    public void add() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("resource/book.xml"));
        Element root = document.getRootElement();
        Element book1 = (Element) root.elements("book").get(1);
        Element authorElement = book1.addElement("author")
                .addAttribute("id", "author2").addText("张三");

        OutputFormat format = OutputFormat.createPrettyPrint();
        //从这里可以看出dom4j默认的编码方式为utf-8
        System.out.println(format.getEncoding());
        //设置编码格式防止乱码   <?xml version="1.0" encoding="gb2312"?>
        format.setEncoding("utf-8");

        //使用FileWriter会乱码,因为使用了默认的gb2312编码输出,而dom4j使用的是默认的UTF-8编码
        //如果format.setEncoding("gb2312"); 使用FileWriter就不会乱码
        //XMLWriter writer = new XMLWriter(new FileWriter("resource/book.xml"),format);

        //使用FileOutputStream输出时指定编码  这个编码要和format.setEncoding("utf-8"); 一样
        //XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("resource/book.xml"), "utf-8"),format);
        //最简单的方法是设置format.setEncoding("utf-8");然后使用字节流输出
        XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format);

        writer.write(document);
        writer.close();
    }

    //在指定位置上添加个新节点(改变list集合的顺序)
    @Test
    public void add2() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("resource/book.xml"));
        Element element = document.getRootElement().element("book");
        List list = element.elements();
        Element publishElement = DocumentHelper.createElement("publish");
        publishElement.addText("机械工业出版社");
        //改变list集合的顺序,就可以达到在指定位置添加新节点
        list.add(1, publishElement);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format);
        writer.write(document);
        writer.close();
    }
}

xml乱码的样子:

时间: 2024-12-17 13:22:29

dom4j的小例子的相关文章

java操作xml的一个小例子

最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要定义好bean的层次结构就可以了,第三方包会自动生成和解析xml. 但是今天发现,这个包有两个问题: 一个是比较复杂(我是菜鸟,求别喷,我真的觉得他挺复杂的..).比如说你要想处理既有属性又有值的xml就比较麻烦.(@XStreamConverter注解这种方法报这个错:com.thoughtwor

laravel 数据库操作小例子

public function demo() { $res = null; //insert数据插入 //$user=array('username'=>'joy','password'=>'123456','age'=>23); //$res = DB::table('users')->insert($user); /* 数据查询 $res = DB::table('users')->where('username','joy')->get(); $res = DB:

spring小例子-springMVC+mybits整合的小例子

这段时间没更博,找房去了...   吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了..   搬家太受罪了... 今天更一下springMVC整合mybits形成最简单的网站demo. 大概效果就是这样的:左边是数据库查询结果,右边是页面访问结果: 首先,一个简单的springMVC小例子可以看这个http://www.cnblogs.com/xuejupo/p/5236448.html 这是在这

cmake 之一个小例子

cmake,比手写makefile更好的选择 安装cmake,此部分略过 一.新建一个工程 这里我是在windows下使用eclipse新建了一个c工程(PS:我一般新建一个Makefile类型的工程,这样比较干净) 二.建立必要的文件夹 我的工程目录: D:\code\cpp\cmakestudy\test>tree /f 卷 软件 的文件夹 PATH 列表 卷序列号为 0006-17B7 D:. │ .cproject │ .project │ CMakeLists.txt │ ├─bin

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

COM2 --- 小例子

在COM1 的小例子中,,我们大概知道什么是组件类 ,什么是接口了.这小节呢,我们来实现一下由一个组件类去实现两个接口的过程. 新建项目: 我们的 解决方案的 名字是 ComDemoCode ,项目名字是 MathToolKit  这表示 我们的 项目 自动 生成的 DLL  的名字就是 MathToolKit(数学工具包). 我们的继承关系 有必要 给大家 先 列出来,让大家 看看 在这里面,IPrimerMath接口 提供 + - * / % 五个基本运算方法,IAdvanceMath接口提

python try小例子

#!/usr/bin/python import telnetlib import socket try: tn=telnetlib.Telnet('10.67.21.29',60000) except socket.error, e: print e exit(1) tn.set_debuglevel(1) tn.write('quit'+'\n') print 'ok' socket.error为错误类型 e为对象 python try小例子,布布扣,bubuko.com

C/C++ New与Delete (小例子)

转自:http://blog.csdn.net/chenzujie/article/details/7011639 先来看两段小程序: 1). #include <iostream.h> #include <String.h> void main(void) { char *str1 = "just have fun"; char *str2 = "happy day"; char *sTmpPtr = new char[255]; char

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux