使用dom4j建立XML文檔

用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 個預約義的實體引用,如&的實體引用爲(&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。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 -->
&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">
相關文章
相關標籤/搜索