用dom4j建立一个简单的xml文档,要建立的xml文档以下所示:java
<!-- 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包。dom
<!-- 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。code
====================步骤分析 分割线 ==========================orm
第一 步. 导入dom4j组件中的两个包, import 语句导入 经典的几个dom4j API 类:xml
<!-- 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,放到后面讲。ip
第四步 . 设置编码 、 输出格式 和 添加文档类型说明。文档
说明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">