使用dom4j创建XML文档

原创
2013/08/27 17:35
阅读数 1.9K

用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 个预定义的实体引用,如&的实体引用为(&amp;)
		 * 或者使用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 -->
&lt; 	< 	小于
&gt; 	> 	大于
&amp; 	& 	和号
&apos; 	' 	省略号
&quot; 	" 	引号

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">
展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部