用dom4j创建一个简单的xml文档,要创建的xml文档如下所示:
<!-- lang: xml -->
<?xml version="1.0" encoding="GBK"?>
<food>
<!--这是根节点-->
<name>hamburger</name>
<price currency="dollar">$1.95</price>
<description>A sandwich made with a patty of ground meat usually in a roll or bun</description>
<calories unit="kCal">260</calories>
</food>
首先要导入dom4j组件中的两个包,一个是***dom4j-1.6.1.jar***文件,另一个lib文件夹下的***jaxen-1.1-beta-6.jar***包。
<!-- lang: java -->
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class CreateXml {
public static void main(String[] args) throws Exception {
Document document = DocumentHelper.createDocument(); //创建xml文档的对象
// DocumentFactory类的静态方法getInstance()方法也可以创建xml文档的对象
// DocumentFactory factory = DocumentFactory.getInstance();
// Document document = factory.createDocument();
Element food = DocumentHelper.createElement("food"); //创建一个普通的节点<food>
document.setRootElement(food); //把<food>节点设置成根节点
food.addComment("这是根节点"); //添加注释
/*
* 创建一个子节点<name>
* 设置节点内容
* 说明:为了避免系统将字符串中的特殊字符当成XML保留字符处理,请使用XML提供的一些实体引用,XML中有5 个预定义的实体引用,如&的实体引用为(&)
* 或者使用CDATA段,在CDATA的标记下,实体引用也将失去作用;API为:Element.addCDATA(String cdata);
*/
Element name = food.addElement("name");
name.setText("hamburger");
//创建price子节点,设置节点内容,添加节点属性
Element price = food.addElement("price");
price.setText("$1.95");
price.addAttribute("currency", "dollar");
//创建description子节点,设置节点内容
Element description = food.addElement("description");
description.setText("A sandwich made with a patty of ground meat usually in a roll or bun");
//创建price子节点,设置节点内容,添加节点属性
Element calories = food.addElement("calories");
calories.setText("260");
calories.addAttribute("unit", "kCal");
//设置输出格式,由于默认的输出排版格式混乱,dom4j也提供了美化的格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setTrimText(false); //保留多余空格
//设置编码,默认为UTF-8,我们设置成GBK;
//设置成功后,xml文档的声明代码应当为<?xml version="1.0" encoding="GBK" ?>
format.setEncoding("GBK");
//文档已经创建完毕,最后输出该文档
// 为了直观演示,可以在控制台直接打出该文档
// XMLWriter xWriter = new XMLWriter(System.out,format);
// xWriter.write(document);
//在本地中生成该文档文件
File file = new File("E:"+File.separator+"001.xml");
if (file.exists()) {
file.delete(); //删除文件是为了保证此文件是第一次写入数据,或者防止你多次写入
} else {
file.createNewFile();
Writer writer = new FileWriter(file);
XMLWriter xWriter = new XMLWriter(writer,format); //实例化XMLWriter对象
xWriter.write(document); //写入数据
xWriter.close(); //关闭
}
}
}
继续扩展一下上面的代码,建立一个稍微完整一点的xml文档,要建立的文档内容如下(其实跟上面没区别,只是为了让看上去完整一些罢了)。
<!-- lang: xml -->
<?xml version="1.0" encoding="GBK"?>
<breakfast_menu>
<!--这是根节点-->
<food>
<name>Belgian Waffles</name>
<price currency="dollar">$5.95</price>
<description>two of our famous Belgian Waffles......</description>
<calories unit="kCal">650</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<price currency="dollar">$7.95</price>
<description>light Belgian waffles covered...</description>
<calories unit="kCal">900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<price currency="dollar">$8.95</price>
<description>为了美观描述就写少点了 ......</description>
<calories unit="kCal">900</calories>
</food>
</breakfast_menu>
java主代码如下:
<!-- lang: java -->
Document document = DocumentHelper.createDocument();
Element breakfast_menu = DocumentHelper.createElement("breakfast_menu");
document.setRootElement(breakfast_menu);
breakfast_menu.addComment("这是根节点");
Element food = breakfast_menu.addElement("food");
food.addElement("name").setText("Belgian Waffles");
food.addElement("price").addAttribute("currency", "dollar").setText("$5.95");
food.addElement("description").setText("two of our famous Belgian Waffles......");
food.addElement("calories").addAttribute("unit", "kCal").setText("650");
Element food2 = breakfast_menu.addElement("food");
food2.addElement("name").setText("Strawberry Belgian Waffles");
food2.addElement("price").addAttribute("currency", "dollar").setText("$7.95");
food2.addElement("description").setText("light Belgian waffles covered...");
food2.addElement("calories").addAttribute("unit", "kCal").setText("900");
Element food3 = breakfast_menu.addElement("food");
food3.addElement("name").setText("Berry-Berry Belgian Waffles");
food3.addElement("price").addAttribute("currency", "dollar").setText("$8.95");
food3.addElement("description").setText("为了美观描述就写少点了 ......");
food3.addElement("calories").addAttribute("unit", "kCal").setText("900");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setTrimText(false);
format.setEncoding("GBK");
XMLWriter xWriter = new XMLWriter(new FileWriter(new File("E:"+File.separator+"001.xml")),format);
xWriter.write(document);
xWriter.close();
结合上面写的实例,整理一下使用dom4j创建XML的 整体步骤 和 常见API。
====================步骤分析 分割线 ==========================
第一 步. 导入dom4j组件中的两个包, import 语句导入 经典的几个dom4j API 类:
<!-- lang: java -->
//DocumentFactory 和 DocumentHelper 的作用是一样的,导入其中一个即可
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
第二步 . 使用 DocumentHelper 类或者DocumentFactory 类 创建一个文档实例:
<!-- lang: java -->
//DocumentHelper 的生成方式,一步搞定
Document document = DocumentHelper.createDocument();
//DocumentFactory 的生成方式
DocumentFactory factory = DocumentFactory.getInstance();
Document document = factory.createDocument();
第三步 . 文档生成后,就可以增加根节点,增加子节点,添加注释,添加属性,添加节点值,这些都是API,放到后面讲。
第四步 . 设置编码 、 输出格式 和 添加文档类型说明。
说明1:dom4j所创建的xml文档,默认的编码集为UTF-8 (通用的国际编码), 可以用 OutputFormat类提供的setEncoding(String encoding)方法设置成其他,常用的编码有:支持简体中文的 GBK 和 GB2312,支持西欧字体的 ISO-8859-1,支持繁体中文的 BIG5等。
说明2 : dom4j生成的默认xml文档采用紧凑的方式排版,可以用OutputFormat类提供的 setTrimText() 、 setIndent() 和 setNewlines() 方法改进,也可以用createPrettyPrint()方法改成缩进的排版方式。
<!-- lang: java -->
//写法1
OutputFormat format = new OutputFormat(indent, newlines, encoding);
//通常可以用另外的方式写,写法2
OutputFormat format = new OutputFormat();
format.setIndent(false); //indent 设置成true或者false,表示是否缩进
format.setNewlines(false); //newlines 设置成true或者false.表示是否换行
format.setTrimText(true); //是否去掉空格
format.setEncoding("GBK"); //encoding 输入你想要的编码格式
//通常的缩进排版,只需要使用createPrettyPrint()便设置完毕
OutputFormat format = OutputFormat.createPrettyPrint();
第五步 . 输出XML文档
<!-- lang: java -->
//使用XMLWriter的构造方法实例XMLWriter对象,
XMLWriter xWriter = new XMLWriter(new FileWriter(file),format);
xWriter.write(document); //向流写入数据
xWriter.close(); //关闭流
可以采用以下代码将xml输出到控制台:
<!-- lang: java -->
//此时xWrite不可关闭
XMLWriter xWriter = new XMLWriter(System.out , format);
=================== 常见API 分割线 =========================
createElement("标签名") :创建一个普通节点;
setRootElement("根节点") :将已经创建好的节点,设置成xml文档的根节点;
addComment("注释内容") :添加注释;
<!-- lang: java -->
//为xml创建一个普通节点 <breakfast_menu>
//然后调用setRootElement()方法把该节点设置为根节点
//为<breakfast_menu>节点添加注释内容
Element breakfast_menu = DocumentHelper.createElement("breakfast_menu");
document.setRootElement(breakfast_menu);
breakfast_menu.addComment("这是根节点");
addElement("标签名") : 为指定的一个节点创建一个子节点
addAttribute("属性名" , "属性值") : 添加属性
setText("节点的文本内容") : 添加节点内容
addText("节点的文本内容") :添加节点内容
addCDATA("节点的文本内容") : 作用跟上面一样,不同的地方是,CDATA可以处理XML文档中的一些保留字符,当然也可以使用Attribute.setEscapeText(false)设置成不被转义。 补充说明:所有 XML 文档中的文本均会被解析器解析,只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。所以非法的 XML 字符必须被替换为实体引用,五个实体引用
<!-- lang: js -->
< < 小于
> > 大于
& & 和号
' ' 省略号
" " 引号
CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。写法格式: <![CDATA[文本内容]]>"
<!-- lang: java -->
Element price = food.addElement("price"); //为<food>标签增加<price>子节点
price.addAttribute("currency", "dollar"); //为<price>添加属性
price.addAttribute("属性2", "属性内容"); //属性可以不断添加
price.setText("$5.95"); //设置节点值
//此处添加的文本内容将不被xml文档解析。
price.addCDATA("&nsp; < >" ); //xml文档生成内容: <![CDATA[&nsp; <>]]>
addDocType(arg0, arg1, arg2) : 添加文档类型说明,如
<!-- lang: java -->
document.addDocType("catalog", null,"file://c:/catalog.dtd");
//这样就向 XML 文档中增加文档类型说明:
<!DOCTYPE catalog SYSTEM "file://c:/catalog.dtd">