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

首頁 > 編程 > JSP > 正文

XStream的使用方法

2024-09-05 00:19:00
字體:
來源:轉載
供稿:網友

在學習jsp的時候我們都會學習到XStream,但是一般情況下我們是不需要經常使用XStream的,但是仍會有小伙伴們會好奇XStream的使用方法,那么今天錯新小編就為大家詳細介紹。

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學習[http://lavasoft.blog.51cto.com]?
*/?
public?class?TestXStream?{?

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

????public?static?void?test()?{?
????????System.out.println("----------XStream學習:http://lavasoft.blog.51cto.com----------");?
????????//目標對象?
????????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學習:http://lavasoft.blog.51cto.com----------?
>>>第[?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();?
????}

上述就是小編為大家介紹關于XStream的使用方法,看完后是不是大家都對XStream的使用方法有了一定的了解呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清无遮挡| 免费99精品国产自在在线| 欧美精品中文字幕一区| 北条麻妃99精品青青久久| 日韩大片在线观看视频| 久久天堂电影网| 亚洲视频在线免费看| 欧美亚洲视频一区二区| 欧美中文字幕精品| 国产成人精品电影| 色偷偷噜噜噜亚洲男人的天堂| 成人国产精品一区二区| 亚洲男人天堂手机在线| 在线国产精品播放| 成人网在线观看| 欧美午夜精品久久久久久久| 人妖精品videosex性欧美| 自拍偷拍亚洲区| 欧美精品在线观看91| 欧美大片在线影院| 米奇精品一区二区三区在线观看| 日韩hd视频在线观看| 成人字幕网zmw| 亚洲日本中文字幕| 国产精品欧美久久久| 亚洲开心激情网| 国产精品视频白浆免费视频| 欧美国产日韩xxxxx| 亚洲欧美日韩成人| 亚洲成人av中文字幕| 欧美三级欧美成人高清www| 久99久在线视频| 欧美亚洲午夜视频在线观看| 亚洲欧美制服中文字幕| 欧美日韩成人在线视频| 亚洲欧美中文日韩在线v日本| 国产亚洲日本欧美韩国| 久久综合免费视频| 日韩精品视频在线播放| 亚洲精品成a人在线观看| 欧美午夜片在线免费观看| 欧美日韩激情美女| 亚洲综合在线做性| 亚洲男人天堂网| 国产精品欧美一区二区| 久久国产加勒比精品无码| 国产精品美女999| 久久精品91久久久久久再现| 午夜精品久久久久久99热软件| 国产午夜精品视频免费不卡69堂| 精品女厕一区二区三区| 欧美放荡办公室videos4k| 精品久久久香蕉免费精品视频| 在线日韩第一页| 国产精品电影久久久久电影网| 欧美激情综合亚洲一二区| 久久深夜福利免费观看| 欧美一级高清免费| 久久色精品视频| 日韩亚洲欧美中文高清在线| 亚洲一区二区三区四区视频| 欧洲日韩成人av| 色哟哟入口国产精品| 亚洲国产精品久久久久秋霞不卡| 日韩经典第一页| 国产精品久久久久久av福利软件| 日韩在线免费av| 国产在线播放91| 91国内免费在线视频| 国产精品视频xxxx| 国产小视频国产精品| 亚洲影视中文字幕| 亚洲偷欧美偷国内偷| 国产日韩中文字幕| 5566日本婷婷色中文字幕97| xvideos亚洲人网站| 欧美日韩在线免费观看| 日韩视频第一页| 欧美人在线观看| 国产午夜精品麻豆| 欧美小视频在线观看| 中文字幕一区日韩电影| 丝袜亚洲另类欧美重口| 国产一区二区三区日韩欧美| 国产成人av在线播放| 久久久久中文字幕2018| 国产精品扒开腿做爽爽爽的视频| 亚洲第一中文字幕| 精品高清一区二区三区| 91亚洲精华国产精华| 黑人极品videos精品欧美裸| 久久免费少妇高潮久久精品99| 亚洲人成电影网站色www| 精品亚洲国产视频| 91中文字幕在线观看| 欧美丰满老妇厨房牲生活| 亚洲第一黄色网| 亚洲91av视频| 久久亚洲综合国产精品99麻豆精品福利| 国产精品99久久久久久白浆小说| 国产精品久久久久久av福利软件| 欧美亚州一区二区三区| 国产精品一区二区久久久久| 亚洲美女黄色片| 91精品国产综合久久男男| 国产欧美日韩中文| 欧美裸体xxxx| 国产日韩欧美电影在线观看| 亚洲第一天堂av| 欧美—级a级欧美特级ar全黄| 欧美亚洲视频一区二区| 色先锋久久影院av| 亚洲激情久久久| 国产精品久久二区| 97精品国产97久久久久久春色| 国产成人综合精品| 日本精品中文字幕| 亚洲综合中文字幕在线观看| 久久精品视频在线观看| 日韩大陆欧美高清视频区| 亚洲国产高清福利视频| 欧美特级www| 久久综合久久美利坚合众国| 久久亚洲精品一区二区| 在线日韩精品视频| 国产精品va在线播放我和闺蜜| 国产精品视频永久免费播放| 国产成人jvid在线播放| 亚洲一级一级97网| 成人乱色短篇合集| 欧美激情综合色综合啪啪五月| 国产精品99久久久久久久久久久久| 欧美裸体男粗大视频在线观看| 91精品国产91久久久久久| 国产精品网红直播| 久久久精品日本| 国产91ⅴ在线精品免费观看| 久久人91精品久久久久久不卡| 一区二区国产精品视频| 亚洲精品中文字幕女同| 色青青草原桃花久久综合| 久久影院免费观看| 红桃视频成人在线观看| 在线精品高清中文字幕| 久久久久国产视频| 亚洲第一天堂av| 亚洲片在线资源| 亚洲香蕉av在线一区二区三区| 国产精品久久久久久久久久尿| 免费99精品国产自在在线| 欧美大码xxxx| 亚洲毛片一区二区| 久久影院模特热| 亚洲欧美国产精品va在线观看| 欧美在线一区二区视频| 欧美一区深夜视频| 96国产粉嫩美女| 亚洲国产婷婷香蕉久久久久久| 欧美日韩在线视频一区二区| 欧美黄色片免费观看| 疯狂欧美牲乱大交777| 国产69精品久久久| 久久福利视频导航| 久久久女女女女999久久|