xml(3)--dom4j實現crud操作,--dom4jcrud

來源:互聯網
上載者:User

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......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.