XML文件的写入和读取(解析)基于DOM4J工具
這兩天做了個天氣的小應用,需要用到百度的天氣api,獲取到的信息是一個xml文檔。
所以就從網上查了一下相關的知識,就是關于怎么去解析出來xml文件的信息。
先放一個我自己寫的例子,加了點注釋,貼這里吧。
package cn.yzy.test;import java.util.List;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.util.Iterator;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;public class MyTest {/*** DOM4J讀寫XML示例*/public static void main(String[] args) {// 用變量保存一下xml文件的路徑String path = "d:\\temp\\student.xml";// 創建xml的方法createXML(path);// 讀取xml文件的方法readXML(path);// 把xml文件讀取成StringString xml = readFile(path);// 輸出一下xmlSystem.out.println(xml);// 把String的xml解析出來readXMLStr(xml);}/*** readFile 讀取文件到String* * @param path* @return*/public static String readFile(String path) {String txt = "";try {// 讀取文件File file = new File(path);// 創建輸入流InputStreamReader isReader = new InputStreamReader(new FileInputStream(file), "utf-8");// 緩沖區BufferedReader bf = new BufferedReader(isReader);// 循環把文本讀取出來String lineTxt = null;while ((lineTxt = bf.readLine()) != null) {txt += lineTxt;}} catch (Exception e) {e.printStackTrace();}// 最后把文本字符串返回return txt;}/*** createXML 創建XML到指定目錄* * @param path*/public static void createXML(String path) {// 讀取文件,檢查文件是否存在,存在就不創建文件了。File file = new File(path);if (!file.exists()) {try {// 創建xml文檔,用DocumentHelperDocument dc = DocumentHelper.createDocument();// 在文檔里要加入元素節點// 添加 根節點 -> 學生信息Element root = dc.addElement("學生信息");// 在 學生信息節點 中 加入 學生Element stu1 = root.addElement("學生");// 可以設置屬性,設置學生 sid 屬性為 001stu1.addAttribute("sid", "001");// 在學生里面加入子元素,鍵值對應Element name1 = stu1.addElement("姓名");name1.setText("張三");Element sex1 = stu1.addElement("性別");sex1.setText("男");Element stu2 = root.addElement("學生");stu2.addAttribute("sid", "002");Element name2 = stu2.addElement("姓名");name2.setText("小紅");Element sex2 = stu2.addElement("性別");sex2.setText("女");// xml文檔生成,準備寫入文件,文件路徑和格式設置好。// 輸出格式以及編碼設置OutputFormat format = new OutputFormat("\n", true);format.setEncoding("utf-8");// 聲明一個寫文件的類XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);// 寫文件,完成后關閉writer.write(dc);writer.close();System.out.println("操作成功");} catch (IOException e) {e.printStackTrace();}} else {System.out.println("文件已存在");}}/*** readXML 讀取XML,從指定文件路徑* * @param path*/public static void readXML(String path) {try {// 輸出文件是否存在System.out.println(new File(path).exists());// 新建一個讀取xml文檔的對象SAXReader reader = new SAXReader();// 將文件讀入DocumentDocument dc = reader.read(path);System.out.println(dc.toString());// 讀取根節點Element root = dc.getRootElement();// 遍歷根節點下,所有子節點(僅能訪問到一層)List nodes = root.elements();for (Iterator it = nodes.iterator(); it.hasNext();) {Element ele = (Element) it.next();System.out.println(ele.getName() + ele.attributeValue("sid"));System.out.println(ele.elementText("姓名"));System.out.println(ele.elementText("性別"));}} catch (DocumentException e) {e.printStackTrace();}System.out.println("--- --- End --- ---");}/*** readXMLStr 從String中讀取XML信息* * @param xml*/public static void readXMLStr(String xml) {try {System.out.println("--- --- readXMLStr --- ---");// 同樣是創建讀取xml的類,但是讀取方法參數改為:new StringReader(xml) 從字符串讀取SAXReader reader = new SAXReader();Document dc = reader.read(new StringReader(xml));System.out.println(dc.toString());Element root = dc.getRootElement();List nodes = root.elements();for (Iterator it = nodes.iterator(); it.hasNext();) {Element ele = (Element) it.next();System.out.println(ele.getName() + ele.attributeValue("sid"));System.out.println(ele.elementText("姓名"));System.out.println(ele.elementText("性別"));}} catch (DocumentException e) {e.printStackTrace();}System.out.println("--- --- End --- ---");} }
網址:
http://www.blogjava.net/biiau/archive/2008/09/24/231005.html
部分DOM4J的解釋
一.Document對象相關
1.讀取XML文件,獲得document對象.
? ? ? ?SAXReader reader = new SAXReader();
? ? ? Document ? document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document對象.
? ? ? String text = "<members></members>";
? ? ? Document document = DocumentHelper.parseText(text);
3.主動創建document對象.
? ? ? ?Document document = DocumentHelper.createDocument();
? ? ? Element root = document.addElement("members");// 創建根節點
二.節點相關
1.獲取文檔的根節點.
? ? ? Element rootElm = document.getRootElement();
2.取得某節點的單個子節點.
? ? ?Element memberElm=root.element("member");// "member"是節點名
3.取得節點的文字
? ? ?String text=memberElm.getText();
也可以用:
? ? ?String text=root.elementText("name");
這個是取得根節點下的name字節點的文字.
4.取得某節點下名為"member"的所有字節點并進行遍歷.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
? ? Element elm = (Element) it.next();
? ?// do something
}
5.對某節點下的所有子節點進行遍歷.
?for(Iterator it=root.elementIterator();it.hasNext();){
? ? ? ? ? ? ? ? ?Element element = (Element) it.next();
? ? ? ? ? ? ? ? // do something
? ? ? ? ? ? ?}
6.在某節點下添加子節點.
Element ageElm = newMemberElm.addElement("age");
7.設置節點文字.
ageElm.setText("29");
8.刪除某節點.
parentElm.remove(childElm);// childElm是待刪除的節點,parentElm是其父節點
9.添加一個CDATA節點.
? ? ? ? ? Element contentElm = infoElm.addElement("content");
? ? ? ? ?contentElm.addCDATA(diary.getContent());
? ? ? ? ? ? contentElm.getText(); // 特別說明:獲取節點的CDATA值與獲取節點的值是一個方法
? ? ? ? ? ? contentElm.clearContent(); //清除節點中的內容,CDATA亦可
三.屬性相關.
1.取得某節點下的某屬性
? ? ? ? ? ? ?Element root=document.getRootElement(); ? ?
? ? ? ? ? ? ?Attribute attribute=root.attribute("size");// 屬性名name
2.取得屬性的文字
? ? ? ? ? ? ?String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");
這個是取得根節點下name字節點的屬性firstname的值.
3.遍歷某節點的所有屬性
? Element root=document.getRootElement(); ? ?
? ? ? ? ? ? for(Iterator it=root.attributeIterator();it.hasNext();){
? ? ? ? ? ? ? ? ?Attribute attribute = (Attribute) it.next();
? ? ? ? ? ? ? ? ?String text=attribute.getText();
? ? ? ? ? ? ? ? ?System.out.println(text);
? ? ? ? ? ? ?}
4.設置某節點的屬性和文字.
newMemberElm.addAttribute("name", "sitinspring");
5.設置屬性的文字
? ? ? ? ? ? ?Attribute attribute=root.attribute("name");
? ? ? ? ? ? ?attribute.setText("sitinspring");
6.刪除某屬性
? ? ? ? ? ? ? Attribute attribute=root.attribute("size");// 屬性名name
? ? ? ? ? ? ?root.remove(attribute);
四.將文檔寫入XML文件.
1.文檔中全為英文,不設置編碼,直接寫入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文檔中含有中文,設置編碼格式寫入的形式.
? ? ? ? ? ? ? OutputFormat format = OutputFormat.createPrettyPrint();
? ? ? ? ? ? ?format.setEncoding("GBK"); ? ?// 指定XML編碼 ? ? ? ?
? ? ? ? ? ? ?XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
? ? ? ? ? ??
? ? ? ? ? ? ?writer.write(document);
? ? ? ? ? ? ?writer.close();
五.字符串與XML的轉換
1.將字符串轉化為XML
String text = "<members> <member>sitinspring</member> </members>";
Document document = DocumentHelper.parseText(text);
2.將文檔或節點的XML轉化為字符串.
? ? ? ? ? ? ?SAXReader reader = new SAXReader();
? ? ? ? ? ? ?Document ? document = reader.read(new File("input.xml")); ? ? ? ? ? ?
? ? ? ? ? ? ?Element root=document.getRootElement(); ? ? ? ? ? ? ? ?
? ? ? ? ? ? ?String docXmlText=document.asXML();
? ? ? ? ? ? ?String rootXmlText=root.asXML();
? ? ? ? ? ? ?Element memberElm=root.element("member");
? ? ? ? ? ? ?String memberXmlText=memberElm.asXML();
總結
以上是生活随笔為你收集整理的XML文件的写入和读取(解析)基于DOM4J工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7搭建NodeJs开发环境以及He
- 下一篇: Ext.Net全部Icon图标名称展示