亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

XStream使用方法總結附實例代碼

2024-09-05 00:21:27
字體:
來源:轉載
供稿:網友
XStream是一個Java對象和XML相互轉換的工具,很好很強大。提供了所有的基礎類型、數組、集合等類型直接轉換的支持。因此XML常用于數據交換、對象序列化(這種序列化和Java對象的序列化技術有著本質的區別)。

XStream中的核心類就是XStream類,一般來說,熟悉這個類基本就夠用了,如果你用的更多,估計是你設計有問題,否則不需要。

XStream對象相當Java對象和XML之間的轉換器,轉換過程是雙向的。創建XSteam對象的方式很簡單,只需要new XStream()即可。
Java到xml,用toXML()方法。
Xml到Java,用fromXML()方法。

在沒有任何設置默認情況下,java到xml的映射,是java成員名對應xml的元素名,java類的全名對應xml根元素的名字。而實際中,往往是xml和java類都有了,要完成相互轉換,必須進行別名映射。

別名配置包含三種情況:
1、類別名,用alias(String name, Class type)。
2、類成員別名,用aliasField(String alias, Class definedIn, String fieldName)
3、類成員作為屬性別名,用 aliasAttribute(Class definedIn, String attributeName, String alias),單獨命名沒有意義,還要通過useAttributeFor(Class definedIn, String fieldName) 應用到某個類上。
別名的配置是非常重要的,但是其中有些細節問題很重要,在例子中會專門做詳細說明。

另外還有不太常用的方法:
addImplicitCollection(Class ownerType, String fieldName),去掉集合類型生成xml的父節點。
registerConverter(Converter converter) ,注冊一個轉換器。

如果你的xml很大,或者為了安全性,以流的方式傳輸,那么XStream也提供豐富的API,
使用起來也非常簡便。目前還用不到,暫不考慮。

如果這些基本的操作還不能滿足你應用的需求,XStream提供豐富的擴展點。你可以實現自己的轉換器。還可以利用XStream完成更負責的功能,比如輸出其他非xml格式的數據,還可以輸出html,還支持XML Dom類型數據,這些應用起來稍微復雜些。當然這些不是XStream應用的重點,也不用理會,真正需要的時候再查看API和源碼研究研究。

XStream的優點很多,但是也有一些小bug,比如在定義別名中的下劃線“_”轉換為xml后會變成“__”這個符號,很變態。因此,盡量避免在別名中實用任何符號,卻是需要下劃線的時候,可以考慮實用連接符“-”,這個沒有問題。

另外,我們的Java Bean中,常常有一些常量,在轉換過程,XStream也會將這些常量轉換過去,形成常量的xml節點,這顯然不是想要的結果,對于常量字段,就不做轉換了。


下面給出一個非常典型的而且實用的例子,作為對總結的補充:
package test;

import java.util.List;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-22 21:10:13<br>
* <b>Note</b>: Please add comment here!
*/
public class Person {
private String name;
private String age;
private Profile profile;
private List<Address> addlist;

public Person(String name, String age, Profile profile, List<Address> addlist) {
this.name = name;
this.age = age;
this.profile = profile;
this.addlist = addlist;
}

public String toString() {
return "Person{" +
"name='" + name + '/'' +
", age='" + age + '/'' +
", profile=" + profile +
", addlist=" + addlist +
'}';
}
}

package test;

import java.sql.Date;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-22 21:10:32<br>
* <b>Note</b>: Please add comment here!
*/
public class Profile {
private String job;
private String tel;
private String remark;

public Profile(String job, String tel, String remark) {
this.job = job;
this.tel = tel;
this.remark = remark;
}

public String toString() {
return "Profile{" +
"job='" + job + '/'' +
", tel='" + tel + '/'' +
", remark='" + remark + '/'' +
'}';
}
}

package test;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-22 21:10:22<br>
* <b>Note</b>: Please add comment here!
*/
public class Address {
private String add;
private String zipcode;

public Address(String add, String zipcode) {
this.add = add;
this.zipcode = zipcode;
}


public String toString() {
return "Address{" +
"add='" + add + '/'' +
", zipcode='" + zipcode + '/'' +
'}';
}
}

package test;

import com.thoughtworks.xstream.XStream;

import java.util.List;
import java.util.ArrayList;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-22 21:10:47<br>
* <b>Note</b>: XStream學習[]
*/
public class TestXStream {

public static void main(String args[]) {
test();
}

public static void test() {
System.out.println("----------XStream學習:");
//目標對象
Address address1 = new Address("鄭州市經三路", "450001");
Address address2 = new Address("西安市雁塔路", "710002");
List<Address> addList = new ArrayList<Address>();
addList.add(address1);
addList.add(address2);
Profile profile = new Profile("軟件工程師", "13512129933", "備注說明");
Person person = new Person("熔巖", "27", profile, addList);

//轉換裝配
XStream xStream = new XStream();

/************** 設置類別名 ****************/
xStream.alias("PERSON", test.Person.class);
xStream.alias("PROFILE", test.Profile.class);
xStream.alias("ADDRESS", test.Address.class);
output(1, xStream, person);

/************* 設置類成員的別名 ***************/
//設置Person類的name成員別名Name
xStream.aliasField("Name", Person.class, "name");
/*[注意] 設置Person類的profile成員別名PROFILE,這個別名和Profile類的別名一致,
* 這樣可以保持XStream對象可以從profile成員生成的xml片段直接轉換為Profile成員,
* 如果成員profile的別名和Profile的別名不一致,則profile成員生成的xml片段不可
* 直接轉換為Profile對象,需要重新創建XStream對象,這豈不給自己找麻煩?*/
xStream.aliasField("PROFILE", test.Person.class, "profile");
xStream.aliasField("ADDLIST", test.Person.class, "addlist");
xStream.aliasField("Add", test.Address.class, "add");
xStream.aliasField("Job", test.Profile.class, "job");
output(2, xStream, person);

/******* 設置類成員為xml一個元素上的屬性 *******/
xStream.useAttributeFor(Address.class, "zipcode");
/************* 設置屬性的別名 ***************/
xStream.aliasAttribute(test.Address.class, "zipcode", "Zipcode");
output(3, xStream, person);

/************* 將xml轉為java對象 ******×****/
String person_xml = "<PERSON>/n" +
" <Name>熔巖</Name>/n" +
" <age>27</age>/n" +
" <PROFILE>/n" +
" <Job>軟件工程師</Job>/n" +
" <tel>13512129933</tel>/n" +
" <remark>備注說明</remark>/n" +
" </PROFILE>/n" +
" <ADDLIST>/n" +
" <ADDRESS Zipcode=/"450001/">/n" +
"<Add>鄭州市經三路</Add>/n" +
" </ADDRESS>/n" +
" <ADDRESS Zipcode=/"710002/">/n" +
"<Add>西安市雁塔路</Add>/n" +
" </ADDRESS>/n" +
" </ADDLIST>/n" +
"</PERSON>";
String profile_xml = " <PROFILE>/n" +
" <Job>軟件工程師</Job>/n" +
" <tel>13512129933</tel>/n" +
" <remark>備注說明</remark>/n" +
" </PROFILE>";
String address_xml = " <ADDRESS Zipcode=/"710002/">/n" +
"<Add>西安市雁塔路</Add>/n" +
" </ADDRESS>";

//同樣實用上面的XStream對象xStream
System.out.println(xStream.fromXML(person_xml).toString());
System.out.println(xStream.fromXML(profile_xml).toString());
System.out.println(xStream.fromXML(address_xml).toString());
}

public static void output(int i, XStream xStream, Object obj) {
String xml = xStream.toXML(obj);
System.out.println(">>>第[ " + i + "]次輸出/n");
System.out.println(xml + "/n");
}
}

----------XStream學習:
>>>第[ 1]次輸出

<PERSON>
<name>熔巖</name>
<age>27</age>
<profile>
<job>軟件工程師</job>
<tel>13512129933</tel>
<remark>備注說明</remark>
</profile>
<addlist>
<ADDRESS>
<add>鄭州市經三路</add>
<zipcode>450001</zipcode>
</ADDRESS>
<ADDRESS>
<add>西安市雁塔路</add>
<zipcode>710002</zipcode>
</ADDRESS>
</addlist>
</PERSON>

>>>第[ 2]次輸出

<PERSON>
<Name>熔巖</Name>
<age>27</age>
<PROFILE>
<Job>軟件工程師</Job>
<tel>13512129933</tel>
<remark>備注說明</remark>
</PROFILE>
<ADDLIST>
<ADDRESS>
<Add>鄭州市經三路</Add>
<zipcode>450001</zipcode>
</ADDRESS>
<ADDRESS>
<Add>西安市雁塔路</Add>
<zipcode>710002</zipcode>
</ADDRESS>
</ADDLIST>
</PERSON>

>>>第[ 3]次輸出

<PERSON>
<Name>熔巖</Name>
<age>27</age>
<PROFILE>
<Job>軟件工程師</Job>
<tel>13512129933</tel>
<remark>備注說明</remark>
</PROFILE>
<ADDLIST>
<ADDRESS Zipcode="450001">
<Add>鄭州市經三路</Add>
</ADDRESS>
<ADDRESS Zipcode="710002">
<Add>西安市雁塔路</Add>
</ADDRESS>
</ADDLIST>
</PERSON>

Person{name='熔巖', age='27', profile=Profile{job='軟件工程師', tel='13512129933', remark='備注說明'}, addlist=[Address{add='鄭州市經三路', zipcode='450001'}, Address{add='西安市雁塔路', zipcode='710002'}]}
Profile{job='軟件工程師', tel='13512129933', remark='備注說明'}
Address{add='西安市雁塔路', zipcode='710002'}

Process finished with exit code 0

在實際中,類的屬性很多,嵌套層次也很復雜,如果僅僅使用XStream原生API來硬編碼設置別名等屬性,顯得太生硬也難以維護。完全可以考慮通過一個xml配置文件來定義所有用到的類的別名定義(包括其成員),然后,通過讀取配置構建一個XStream的工廠,在用到時候直接去取,而不是讓實用者組裝。我目前的一個項目中,就是這么實現的,效果非常的好。

下面我給出針對上面提出的問題一個解決方案:

思想:考慮做一個過濾器,在xml轉java之前,在Java轉xml之后,應用這個過濾器。這個過濾器提供將xml中的“__”替換為“-”,并且將xml中的不需要的節點剔除。
在過濾之前,我實現了個轉換器裝配,這一步通過xml來配置,并在java中獲取。
代碼就省略了,這一步很靈活,關鍵看你的應用了。

為了能過濾xml,我們需要用Dom4j遞歸遍歷xml文檔。下面一些算法代碼:

//遞歸算法:遍歷配置文件,找出所有有效的xpath
private static void recursiveElement(Element element) {
List<Element> elements = element.elements();
validXPathList.add(element.getPath());
if (elements.size() == 0) {
//沒有子元素
} else {
//有子元素
for (Iterator<Element> it = elements.iterator(); it.hasNext();) {
//遞歸遍歷
recursiveElement(it.next());
}
}
}

//遞歸算法:遍歷xml,標識無效的元素節點
private static void recursiveFixElement(Element element) {
List<Element> elements = element.elements();
if (!validXPathList.contains(element.getPath())) {
element.addAttribute("delete", "true");
}
if (elements.size() == 0) {
//沒有子元素
} else {
//有子元素
for (Iterator<Element> it = elements.iterator(); it.hasNext();) {
Element e = it.next();
if (!validXPathList.contains(e.getPath())) {
e.addAttribute("delete", "true");
}
//遞歸遍歷
recursiveFixElement(e);
}
}
}

/**
* 過濾器接口方法,轉換不規范字符,剔除無效節點
*
* @param xmlStr 要過濾的xml
* @return 符合轉換器要求的xml
*/
public static String filter(String xmlStr) {
Document document = null;
try {
document = DocumentHelper.parseText(xmlStr.replaceAll("__", "_"));
//遞歸的調用:標記要剔除的xml元素
recursiveFixElement(document.getRootElement());
List<Node> nodeList = document.selectNodes("http://@delete");
for (Node node : nodeList) {
node.getParent().detach(); //剔除xml元素
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
return document.asXML();
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品夫妻激情| 在线色欧美三级视频| 91中文字幕在线观看| 在线视频精品一| 精品国产依人香蕉在线精品| 亚洲人精品午夜在线观看| 97色在线播放视频| 91在线高清免费观看| 欧美激情一级精品国产| 日韩麻豆第一页| 成人伊人精品色xxxx视频| 97在线精品国自产拍中文| 国产精品综合网站| 色综合91久久精品中文字幕| 性欧美在线看片a免费观看| 国内免费久久久久久久久久久| 欧美激情精品久久久久久黑人| 美女视频黄免费的亚洲男人天堂| 在线观看日韩欧美| 欧美大片欧美激情性色a∨久久| 伊人一区二区三区久久精品| 丝袜情趣国产精品| 欧美一乱一性一交一视频| 亚洲精品久久久久久下一站| 欧美性xxxx极品hd满灌| 97涩涩爰在线观看亚洲| 亚洲字幕在线观看| 日本一欧美一欧美一亚洲视频| 国产精品麻豆va在线播放| 91高清免费视频| 成人激情视频小说免费下载| 亚洲精品美女免费| 米奇精品一区二区三区在线观看| 色婷婷**av毛片一区| 黄网站色欧美视频| 亚洲aa在线观看| 97在线视频免费播放| 秋霞成人午夜鲁丝一区二区三区| 日韩专区中文字幕| 亚洲a级在线播放观看| 久久精品99国产精品酒店日本| 91精品国产91久久久久久久久| 中文字幕日韩综合av| 精品中文字幕视频| 国内精品久久久久久中文字幕| 国产一区二区三区四区福利| 国产精品视频自拍| 国产精品久久久久久久av电影| 国产丝袜一区二区三区免费视频| 98视频在线噜噜噜国产| 91精品久久久久久久久青青| 国产亚洲视频中文字幕视频| 欧美日韩国产一区二区三区| 自拍视频国产精品| 久久亚洲电影天堂| 日韩动漫免费观看电视剧高清| 精品人伦一区二区三区蜜桃免费| 久久91亚洲精品中文字幕奶水| 久久精品国产v日韩v亚洲| 国产精品中文久久久久久久| 久久精品视频在线观看| 2018中文字幕一区二区三区| 久久久综合免费视频| 久久久久久久999| 久久综合伊人77777尤物| 中文字幕亚洲一区二区三区| 这里只有精品视频在线| 欧美日韩一区二区在线播放| 久久久久久久网站| 国产精品免费在线免费| 成人中文字幕在线观看| 国产精品视频永久免费播放| 精品亚洲一区二区三区四区五区| 欧美亚洲在线播放| 欧美黑人xxxx| 国产精品久久久久久久久久久久久久| 精品久久国产精品| 欧美性jizz18性欧美| 亚洲一区二区三区sesese| 欧美一级视频免费在线观看| 中文字幕一区二区精品| 日韩免费观看在线观看| 欧美日韩日本国产| 亚洲国产婷婷香蕉久久久久久| 91久久综合亚洲鲁鲁五月天| 上原亚衣av一区二区三区| 欧美性少妇18aaaa视频| 国产精品a久久久久久| 岛国视频午夜一区免费在线观看| 亚洲成人免费在线视频| 日韩精品欧美国产精品忘忧草| 日韩av资源在线播放| 亚洲精品一区二区网址| 亚洲日本欧美中文幕| 亚洲老头同性xxxxx| 欧美视频免费在线观看| 欧美在线视频免费| 久久精品国产成人精品| 久久久精品网站| 成人精品一区二区三区| 中文字幕av日韩| 一区二区三区亚洲| 久久国产视频网站| 亚洲精品美女久久久久| 亚洲欧美综合区自拍另类| 国产中文字幕亚洲| 国产精品成人v| 国产欧美日韩精品在线观看| 黑人巨大精品欧美一区二区三区| 一区二区三区 在线观看视| 精品视频在线播放免| 久久久久中文字幕2018| 亚洲国产精品99| 亚洲国产古装精品网站| 日韩中文字幕亚洲| 亚州成人av在线| 国内精品400部情侣激情| 91麻豆国产语对白在线观看| 亚洲视频一区二区三区| 国产一区二区三区在线观看网站| 九九热最新视频//这里只有精品| 97视频在线观看网址| 国产精品亚洲片夜色在线| 亚洲欧洲美洲在线综合| 久久久精品视频在线观看| 91po在线观看91精品国产性色| 欧美丝袜一区二区三区| 日韩专区在线播放| 中文字幕欧美国内| 久久艳片www.17c.com| 国产一区二区动漫| 91高清免费视频| 黑人极品videos精品欧美裸| 亚洲视频在线免费观看| 日本国产一区二区三区| 日韩av在线高清| 久久久精品电影| 91精品国产91久久久久久吃药| 欧美激情a在线| 亚洲综合色激情五月| 日韩电影视频免费| 亚洲天堂免费在线| 欧美性极品xxxx做受| 亚洲电影在线观看| xxxx欧美18另类的高清| 国产区亚洲区欧美区| 69精品小视频| 国产日韩在线看片| 亚洲精品久久久一区二区三区| 91精品啪aⅴ在线观看国产| 91国产中文字幕| 亚洲第一福利网站| 中文字幕日韩免费视频| 一区二区三区视频免费在线观看| 亚洲综合日韩中文字幕v在线| 在线播放日韩专区| 久久久久久久一区二区三区| 久久久亚洲成人| 亚洲精品美女网站| 国产午夜精品视频免费不卡69堂| 国产精品狠色婷| 精品在线小视频| 久久久91精品国产| 亚洲成在人线av|