xml(3)--dom4j實現crud操作,--dom4jcrud
1.XML解析技術概述
(1)XML解析方式分為兩種:dom和sax
dom:(Document Object Model, 即文件物件模型) 是 W3C 組織推薦的處理 XML 的一種標準方式。
sax: (Simple API for XML) 不是官方標準,但它是 XML 社區事實上的標準,幾乎所有的 XML 解析器都支援它。
(2)XML解析器(軟體/實作類別)
Crimson(SUN)、Xerces(IBM->APACHE) 、Aelfred2(DOM4J開源組織)
(3)XML解析技術API/開發包(在使用時,一定要匯入jar包dom4j-1.6.1.jar,然後右鍵“Butid Path”)
Jaxp(SUN/dom/sax)、
Jdom、
dom4j
以上三種,應該說逐漸遞增的好用吧,最簡單大莫如dom4j。
2.
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");
3.將文檔寫入XML檔案
(1)文檔中全為英文,不設定編碼,直接寫入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); document.add(rootElement);
writer.write(document);
writer.flush();
writer.close();
(2)文檔中含有中文,設定編碼格式寫入的形式.
OutputFormat format =OutputFormat.createCompactFormat();//以緊湊的方式
OutputFormat of = OutputFormat.createPrettyPrint();//有換行的模式
OutputStream os = new FileOutputStream("src/cn/itcast/xml/dom4j/car.xml");
XMLWriter xmlWriter = new XMLWriter(os,format);
或者這樣:(輸出中文字元的要設定編碼方式“utf-8”)
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());
xmlWriter.write(document);
xmlWriter.close();
4.(1)CRUD的含義:CreateReadUpdateDelete增刪查改
(2)XML解析器有二類,分別是DOM和SAX。
a)DOM一次性將整個XML檔案讀到記憶體,形成一個倒狀的樹形結構
b)SAX多次將整個XML檔案讀到記憶體
c)Document對象代表XML檔案在記憶體中的映像
(3)常用的API如下:
SAXReader saxReader = new SAXReader(); SAXReader是dom4j的核心類
Document document = saxReader.read("*.xml")
Document.getRootElement()
Element.getName()
Element.elements():取得該元素下的所有直接子項目
Element.elementText():從一個元素導航到另一個元素且取出該元素的文本
Element.element("sex"):從一個元素導航到另一個元素
Element.attributeValue("id"):取得一個元素對應的屬性
Element.addElement("sex").setText("男"):添加新元素,同時設定該元素文本的值
OutputFormat format = OutputFormat.createPrettyPrint():使用縮格形式寫XML檔案
XMLWriter xmlWriter = new XMLWriter(os,format):構造XML寫入器
xmlWriter.write(document):將記憶體中的document對象寫入硬碟
firstCarElement.remove(firstCarPriceElement):從直接父元素刪除直接子項目
//firstCarPriceElement.getParent().remove(firstCarPriceElement):從直接父元素刪除直接子項目
5.代碼練習(實現對xml的crud操作,不過在對xml的cud中都蘊含著r,所以並沒有單獨寫r)
xml源檔案(student.xml):
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<Student num="2014072201" >
<name>一葉扁舟</name>
<age>22</age>
<profession>軟體工程</profession>
</Student>
<Student num="2014072202">
<name>努力</name>
<age>21</age>
<profession>軟體工程</profession>
<sex>女</sex>
</Student>
</Person>
測試代碼(Demo.java):
package cn.wwh.www.xml.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
/**
*類的作用:採用xml的dom4j解析xml檔案,並能夠實現(CRUD操作)
*注意:
* 1.採用xpp3reader的解析方式
XPP3Reader xpp3Reader = new XPP3Reader();
Document document = xpp3Reader.read(new File(filePath));
不知道為啥不行????
*
*
*@author 一葉扁舟
*@version 1.0
*@建立時間: 2014-7-22 上午10:39:47
*/
public class Demo2 {
private final static String filePath = "src/cn/wwh/www/xml/dom4j/student.xml";
// 實現xml屬性和元素的增加
@Test
public void create() throws Exception{
// 採用SAXReader的解析方式:
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filePath));
Element root = document.getRootElement();
// 擷取Person下的第一元素Student
Element firstElement = (Element) root.elements().get(0);
// 為第一個Student,添加一個屬性id,屬性值為:"19920101"
firstElement.addAttribute("id", "19920101");
firstElement.addElement("sex").setText("男");
// 輸出根節點下的所有東西
List<Element> elements = root.elements();
System.out.println("根節點下有:"+elements.size()+"元素");
for (Element e : elements) {
// 擷取student的屬性
Attribute attribute = e.attribute(0);
System.out.println("標籤名:"+e.getName());
System.out.println(e.getName()+"屬性 值:"+attribute.getData()+"\n" +
"attribute.getName():"+attribute.getName()+"\n" +
"attribute.getText():"+attribute.getText());
// 擷取所有的子標籤
List<Element> child = e.elements();
for (Element element : child) {
System.out.println(element.getName()+":"+
element.getText());
}
}
// 將資料寫會到xml檔案中
OutputStream os = new FileOutputStream(filePath);
OutputFormat of = OutputFormat.createPrettyPrint();
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
XMLWriter xmlWrite = new XMLWriter(osw, of);
xmlWrite.write(document);
xmlWrite.flush();
xmlWrite.close();
}
// 實現對xml檔案的修改
@Test
public void update() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filePath));
Element root =document.getRootElement();
System.out.println(root.getName());
// 擷取第一個Student
Element firstStudent = (Element) root.elements().get(0);
Element sex = firstStudent.element("sex");
// firstStudent.element("sex").setText("女");
System.out.println(sex.getName());
sex.setText("男");
// 將資料寫進xml檔案中
OutputStream os = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
OutputFormat of = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(osw,of);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}
// 實現對xml的刪除操作
@Test
public void delete() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filePath));
Element element = document.getRootElement();
Element firstStudent = (Element) element.elements().get(0);
// 擷取Student 的屬性id
Attribute attribute = firstStudent.attribute("id");
System.out.println(attribute.getName());
firstStudent.remove(attribute);
// firstStudent.remove();
// 刪除第一Student下sex的元素:
Element sex = firstStudent.element("sex");
sex.getParent().remove(sex);
// sex.remove(sex);
// 將資料寫迴文件中
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.flush();
writer.close();
}
}
代碼測試(僅僅顯示的create的):
javaweb怎把一個action方法裡面產生的XML(用dom4j操作)用另存新檔儲存到想要的位置
//這是我寫的一個產生xml的代碼,如果有需要的話可以把dom4j包和執行個體發給你,也有解析xml的
package com.zuxia.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* 使用dom4j解析xml
*
* 1. 建立解析器
*
* 2. 建立文檔對象Document
*
* 3. 擷取根節點
*
*/
public class Dom4jParseXML {
public static void main(String[] args) {
//1. 建立解析器
SAXReader saxreader = new SAXReader();
Document doc = null;
try {
//2. 建立文檔對象Document
doc = saxreader.read(new File("src/studentinfo.xml"));
} catch (Exception e) {
System.out.println("讀取xml檔案異常!");
}
//3. 擷取根節點
Element root = doc.getRootElement();
//4. 擷取元素
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()){
Element student = iter.next();
System.out.println("學號:"+student.attributeValue("stuno")+"\t姓名:"+student.elementText("name"));
}
//提示使用者添加新的資料
Scanner sc = new Scanner(System.in);
System.out.println("請輸入學號:");
String stuno = sc.nextLine();
System.out.println("請輸入姓名:");
String name = sc.nextLine();
System.out.println("請輸入年齡:");
String age = sc.nextLine();
//將資料添加在Document中
......餘下全文>>
怎用dom4j操作XML
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* @author Holen Chen
*/
public class Dom4jDemo {
public Dom4jDemo() {
}
/**
* 建立一個XML文檔,文檔名由輸入參數決定
* @param filename 需建立的檔案名稱
* @return 返回操作結果, 0表失敗, 1表成功
*/
public int createXMLFile(String filename){
/** 返回操作結果, 0表失敗, 1表成功 */
int returnValue = 0;
/** 建立document對象 */
Document document = DocumentHelper.createDocument();
/** 建立XML文檔的根books */
Element booksElement = document.addElement("books");
/** 加入一行注釋 */
booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
/** 加入第一個book節點 */
Element bookElement = booksElement.addElement("book");
/** 加入show參數內容 */
bookElement.addAttribute("show","yes");
/** 加入title節點 */
Element titleElement = bookElement.addElement("title");
/** 為title設定內容 */
titleElement.setText("Dom4j Tutorials");
/** 類似的完成後兩個book */
bookElement = booksElement.addElement("book");
bookElement.addAttribute......餘下全文>>