XML數(shù)據(jù)解析
XML數(shù)據(jù)解析是將數(shù)據(jù)文檔解析成不同的格式溺职,XML現(xiàn)在已經(jīng)成為一種通用的數(shù)據(jù)交換格式斩祭,它具有平臺無關性,語言無關性,系統(tǒng)無關性,給數(shù)據(jù)集成與交互帶來了極大的方便矢空。
現(xiàn)在解析XML有四種主流的方法廉赔,即:DOM呈野、SAX杈抢、JDOM和DOM4J神汹。然而這四種解析XML的方法都比較復雜,現(xiàn)在本文引入比較簡單的XML解析API古今,Simple XML
Simple XML
屁魏,借助第三方寫好的jar包,完美實現(xiàn)了細節(jié)捉腥,提供讀氓拼、寫XML文檔的2個方法read()
和write()
,導入工程即可使用抵碟。
Simple
是一個 Java 框架桃漾,用于簡化序列化和反序列化 XML 的過程。
使用 Simple拟逮,開發(fā)人員可以簡化將Java 對象(POJO)轉換成 XML 文檔的過程 — 序列化過程呈队。Simple 也可促進相反的過程:開發(fā)人員可以將 XML 文檔轉換成 POJO — 反序列化過程。
Simple 使用注解來支持序列化和反序列化過程唱歧。根據(jù)相應的 XML 文檔應該如何出現(xiàn)宪摧,對 POJO 進行注解。一些字段被注解為屬性颅崩,另一些字段被注解為元素几于。類通常被注解為根元素。
使用 Simple 的優(yōu)勢
1沿后、首先沿彭,它促進快速應用程序開發(fā)。Simple 是如此簡單尖滚,它支持開發(fā)人員快速實現(xiàn)健壯的喉刘、使用 XML
序列化和反序列化的應用程序,無需完成長長的學習曲線以及付出繁重的開發(fā)勞動漆弄。
2睦裳、其次,Simple 不需要配置撼唾。前面已經(jīng)提到廉邑,Simple 使用注解。這些注解取代了基于 XML 的配置文件(其他框架一般都有這樣的配置文件)倒谷。
3蛛蒙、最后,Simple 只讓使用它的應用程序增加少量的內(nèi)存占用渤愁。Java 歸檔(Java Archive牵祟,JAR)文件只有 239 KB。Simple 也不依賴于一系列
其他 JAR 文件抖格,而其他框架則通常不是這樣的诺苹。
Simple XML的使用:
下載歸檔文件,我上傳的資源里有http://download.csdn.NET/detail/ljheee/9481052咕晋;獲得 Simple,解壓文件之后,注意在 jar 目錄中有一個 JAR 文件(simple-xml-2.7.1.jar)筝尾。在編譯時和運行時,類路徑中需要有這個 JAR 文件办桨。
在main()方法里實例化一個Persister
對象筹淫。就可調用read()和write()。該類是 Simple 框架的一部分呢撞,它實現(xiàn)了Serializer
接口损姜。
具體案例如下
實體對象類Book
package com.ljh.xml;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
public class Book {
@Attribute(name="id",required=false)
private String isbn; //書號isbn
@Element(required=false)
private String title; //書名
@Element(required=false)
private int price; //書的價格
@Element(required=false)
private Author author; //書的作者--也是個實體類
public Book() {
}
public Book(String isbn, String title, int price) {
super();
this.isbn = isbn;
this.title = title;
this.price = price;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public void setAuthor(Author author) {
this.author = author;
}
@Override
public String toString() {
return "Book [author=" + author + ", isbn=" + isbn + ", price=" + price
+ ", title=" + title + "]";
}
}
書的作者類Author
package com.ljh.xml;
import org.simpleframework.xml.Attribute;
public class Author {
@Attribute(required=false)
private String name; //作者名
@Attribute(required=false)
private String phone; //作者電話
public Author() {
super();
}
public Author(String name, String phone) {
super();
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Author [name=" + name + ", phone=" + phone + "]";
}
}
數(shù)目列表類----多個對象添加到列表中BookList
import java.util.ArrayList;
import org.simpleframework.xml.*;
import org.simpleframework.xml.ElementList;
@Root
public class BookList {
@ElementList(inline=true)
private ArrayList<Book> list;
public BookList() {
list = new ArrayList<Book>();
}
public ArrayList<Book> getList() {
return list;
}
public void add(Book b){
list.add(b);
}
@Override
public String toString() {
return "BookList [list=" + list + "]";
}
}
測試類Test
package com.ljh.xml;
import java.io.File;
import org.simpleframework.xml.core.Persister;
/**
* 實例化一個Persister對象,
* 調用read()和write()殊霞,按指定的類型[Book]解析
*/
public class Test {
/**
* Write [entity Object] to XML
* 把實體對象--寫成xml格式文檔
* @param persister
*/
public static void write(Persister persister) {
Book bo = new Book("XX021", "復活", 250);
bo.setAuthor(new Author("adf","15777"));
Book bo1 = new Book("XX0212", "死亡之巔", 110);
bo1.setAuthor(new Author("kk","189"));
Book bo2 = new Book("XX0213", "JVM解析", 258);
bo2.setAuthor(new Author("pou","142"));
BookList booklist = new BookList();
booklist.add(bo);
booklist.add(bo1);
booklist.add(bo2);
try {
persister.write(booklist, new File("b.xml"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* read XML to [entity Object]
* 讀取XML文件摧阅,解析成實體對象
* @param persister
*/
public static void read(Persister persister) {
try {
//讀取File("b.xml"),解析成BookList.class類型
BookList blist = persister.read(BookList.class,new File("b.xml"));
System.out.println(blist.getList());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//Persister序列化绷蹲、持久化---simple-xml-2.7.1.jar里提供的[是其他人已經(jīng)寫好分裝好的]
Persister persister = new Persister();//實例化一個Persister
對象
// write( persister); //寫
read( persister); //讀
}
}
example2
public class DataTitle {
@Attribute
private String isShow;
@Attribute
private String dataFormat;
@Attribute(required = false)
private String yAxis;
@Text
private String title;
//忽略getter setter
}
public class ReportConfig {
@Element
private String chartType;
@Element
private String dataExpress;
@ElementList(entry = "title", type = DataTitle.class, inline = true, required = false)
private List<DataTitle> titles;
}
對應要解析的XML
<reportConfig>
<chartType>bar</chartType>
<dataExpress>item_name,#{month_plan},#{curr_day},#{curr_month},#{completion_rate},#{gross_rate},#{single_car},#{month_ratio}</dataExpress>
<title isShow="N" dataFormat="string">項目分析</title>
<title isShow="Y" dataFormat="double">本月計劃</title>
<title isShow="Y" dataFormat="double">今日完成</title>
<title isShow="Y" dataFormat="double">累計完成</title>
<title isShow="Y" dataFormat="percent">完成率(%)</title>
<title isShow="Y" dataFormat="percent">毛利率(%)</title>
<title isShow="Y" dataFormat="double">單車</title>
<title isShow="Y" dataFormat="percent">環(huán)比(%)</title>
</reportConfig>