最高效的XML解析方式-----Simple 簡化 XML 解析

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>

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棒卷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祝钢,更是在濱河造成了極大的恐慌比规,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦英,死亡現(xiàn)場離奇詭異蜒什,居然都是意外死亡,警方通過查閱死者的電腦和手機疤估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門灾常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃拇,你說我怎么就攤上這事钞瀑。” “怎么了慷荔?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵仔戈,是天一觀的道長。 經(jīng)常有香客問我拧廊,道長监徘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任吧碾,我火速辦了婚禮凰盔,結果婚禮上,老公的妹妹穿的比我還像新娘倦春。我一直安慰自己户敬,他們只是感情好落剪,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尿庐,像睡著了一般忠怖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抄瑟,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天凡泣,我揣著相機與錄音,去河邊找鬼皮假。 笑死鞋拟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惹资。 我是一名探鬼主播贺纲,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褪测!你這毒婦竟也來了猴誊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤侮措,失蹤者是張志新(化名)和其女友劉穎稠肘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝毛,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡项阴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆包。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环揽。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庵佣,靈堂內(nèi)的尸體忽然破棺而出歉胶,到底是詐尸還是另有隱情,我是刑警寧澤巴粪,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布通今,位于F島的核電站,受9級特大地震影響肛根,放射性物質發(fā)生泄漏辫塌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一派哲、第九天 我趴在偏房一處隱蔽的房頂上張望臼氨。 院中可真熱鬧,春花似錦芭届、人聲如沸储矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽持隧。三九已至即硼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屡拨,已是汗流浹背只酥。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洁仗,地道東北人层皱。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓性锭,卻偏偏與公主長得像赠潦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子草冈,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容