用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">