使用dom4j创建XML文档

用dom4j创建一个简单的xml文档,要创建的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包。


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文档,要建立的文档内容如下(其实跟上面没区别,只是为了让看上去完整一些罢了)。


<?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主代码如下:


            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 类:



        //DocumentFactory 和 DocumentHelper 的作用是一样的,导入其中一个即可
         import org.dom4j.Document;
         import org.dom4j.DocumentFactory;
         import org.dom4j.DocumentHelper;
         import org.dom4j.Element;

第二步 . 使用 DocumentHelper 类或者DocumentFactory 类 创建一个文档实例:



                    //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()方法改成缩进的排版方式。

  
          //写法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文档


       //使用XMLWriter的构造方法实例XMLWriter对象,
     XMLWriter xWriter = new XMLWriter(new FileWriter(file),format);    
         xWriter.write(document);           //向流写入数据
     xWriter.close();                                //关闭流

可以采用以下代码将xml输出到控制台:


       //此时xWrite不可关闭
    XMLWriter xWriter = new XMLWriter(System.out , format);

=================== 常见API 分割线 =========================

createElement(“标签名”) :创建一个普通节点;

setRootElement(“根节点”) :将已经创建好的节点,设置成xml文档的根节点;

addComment(“注释内容”) :添加注释;


        //为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)设置成不被转义。

<!-- lang: js -->

<!-- lang: js -->
<   <   小于
>   >   大于
&   &   和号
&apos;  '   省略号
"   "   引号

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。写法格式: 文本内容”



    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) : 添加文档类型说明,如


document.addDocType("catalog", null,"file://c:/catalog.dtd");
//这样就向 XML 文档中增加文档类型说明:
<!DOCTYPE catalog SYSTEM "file://c:/catalog.dtd">

你可能感兴趣的:(xml,dom4j,创建)