------------siwuxie095
工程名:TestCreateXML
包名:com.siwuxie095.xml
類名:CreateXML.java
工程結構目錄如下:
代碼:
package com.siwuxie095.xml;
import java.io.File; import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document; import org.w3c.dom.Element;
public class CreateXML {
/** * 使用Java語言實現創建XML數據和輸出XML數據 * DOM方式操作和生成XML數據 * * @param args */ public static void main(String[] args) {
//創建一個新的 DocumentBuilderFactory, //使用靜態方法調用 newInstance()方法,創建一個新的實例 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//創建一個 DocumentBuilder //有異常拋出,用 try catch 捕獲 DocumentBuilder builder=factory.newDocumentBuilder();
//創建一個全新的 XML 文檔:Document //(注意:使用 org.w3c.dom 包中的 Document 類) Document document=builder.newDocument();
//先添加一個根元素:root,並指定標簽:languages Element root=document.createElement("languages"); //設置根元素的屬性,鍵值對 root.setAttribute("category", "it");
Element lan1=document.createElement("lan"); lan1.setAttribute("id", "1"); Element name1=document.createElement("name"); name1.setTextContent("Java"); Element ide1=document.createElement("ide"); ide1.setTextContent("Eclipse");
Element lan2=document.createElement("lan"); lan2.setAttribute("id", "2"); Element name2=document.createElement("name"); name2.setTextContent("Swift"); Element ide2=document.createElement("ide"); ide2.setTextContent("Xcode");
Element lan3=document.createElement("lan"); lan3.setAttribute("id", "3"); Element name3=document.createElement("name"); name3.setTextContent("C#"); Element ide3=document.createElement("ide"); ide3.setTextContent("Visual Studio");
//元素創建完畢后,將 name 元素和 ide 元素添加到 lan 元素中 //使之成為 lan 元素的子節點 //傳入的是Node類型,而Element是繼承自Node的,所以可以傳入 lan1.appendChild(name1); lan1.appendChild(ide1);
lan2.appendChild(name2); lan2.appendChild(ide2);
lan3.appendChild(name3); lan3.appendChild(ide3);
//同理:將 lan 添加到 root 中 root.appendChild(lan1); root.appendChild(lan2); root.appendChild(lan3);
//最后,將 root 添加到 document 中, //實現 XML 數據的節點一層一層包裝,最終包裝到 root 和 document 中 document.appendChild(root);
//----------------------------------------------------------------- //XML數據准備完成,將當前創建好的 XML 數據,通過網絡以字符串的形式傳遞 //(關鍵是:怎么將XML數據轉換成字符串)
//創建一個 TransformerFactory,同樣通過靜態方法調用類的newInstance()方法 //獲取一個新的實例 TransformerFactory transformerFactory=TransformerFactory.newInstance();
//創建一個 Transformer,可以將 XML 文檔轉換成其他格式 //有異常拋出,用 try catch 捕獲 Transformer transformer=transformerFactory.newTransformer();
//調用 Transformer 的 transform() 方法,傳入的參數類型很奇怪 //第一個參數(輸入值)是 Source 類型,第二個參數(輸出值)是 Result 類型 //第一個參數(輸入值)是固定的,由於 Source 是通過 document 來創建的, //傳入匿名對象 new DOMSource(),DOMSource()的參數是Node類型, //而 Document 也是繼承自Node,所以可以傳入 document,將 XML 文檔作為轉換的源 // //第二個參數(輸出值)可以有2種方法, //第一個可以轉換為字符串,第二個可以轉換為文件 //傳入匿名對象 new StreamResult(),支持File輸出一個文件,也支持 Writer寫出 //如果想讓XML數據通過網絡傳播,需要轉換成字符串,這就需要傳入 Writer //先創建一個 StringWriter //有異常拋出,用 try catch 捕獲 StringWriter writer=new StringWriter(); transformer.transform(new DOMSource(document), new StreamResult(writer));
//最后將 StringWriter 轉換為 字符串 //輸出只有一行,是純粹的XML內容,丟失了換行符、縮進符 System.out.println(writer.toString());
//轉換成文件,第二個參數的參數傳入文件對象 transformer.transform(new DOMSource(document), new StreamResult(new File("languages.xml")));
} catch (ParserConfigurationException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); }
}
} |
運行一覽:
languages.xml 的內容:
格式化 languages.xml:
Ctrl+Shift+F,或 全選(Ctrl+A),再 Ctrl+I
運行后,工程結構目錄一覽:
【made by siwuxie095】