Ⅰ 用XStream 轉換java對象成xml的一個疑問
Ⅱ xstream xml轉化成java對象
xml to java對象:
static MessageDatabase load(String persistFile) {
MessageDatabase messageDatabase = null;
Reader reader = null;
try {
reader = new FileReader(persistFile);
XStream xstream = new XStream(new JDomDriver());
messageDatabase = (MessageDatabase) xstream.fromXML(reader);
// for upgrade
if (messageDatabase != null) {
messageDatabase.upgrade();
}
}
catch (FileNotFoundException ex) {
;
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException ex) {
log.warn("Exception when closing reader", ex);
}
}
}
if (messageDatabase == null) {
messageDatabase = new MessageDatabase();
messageDatabase.setMessages(new LinkedList());
messageDatabase.setStickyMessages(new LinkedList());
}
messageDatabase.persistFile = persistFile;
return messageDatabase;
}
Ⅲ 我現在使用xstream反序列化,把XML轉換為java對象
多餘的欄位如果是單個的話。你可以把它作為一個屬性啦?
然後<filed>作為一個集合..
addImplicitCollection(Class ownerType, String fieldName),去掉集合類型生成xml的父節點。
Ⅳ java用XStream把xml轉換成javabean的問題
xStream可以輕易的將Java對象和xml文檔相互轉換,而且可以修改某個特定的屬性和節點名稱,而且也支持json的轉換;它們都完美支持JSON,但是對xml的支持還不是很好。一定程度上限制了對Java對象的描述,不能讓xml完全體現到對Java對象的描述。這里將會介紹xStream對JSON、XML的完美支持。xStream不僅對XML的轉換非常友好,而且提供annotation註解,可以在JavaBean中完成對xml節點、屬性的描述。以及對JSON也支持,只需要提供相關的JSONDriver就可以完成轉換。
Ⅳ 如何創建xstream的註解工廠類,將xml轉換成java對象
本文記錄一下使用xstream這個api的註解特性對Java對象與XML字元串相互轉換的一些代碼示例。
我們很多人都處理過XML文件,也有很多非常成熟的第三方開源軟體。如:jdom、dom4j等。雖然他們的功能非常強大,但在使用上還是有點不那麼習慣。對於格式比較固定的XML文檔,它的結構沒有變化或是很少變化,這時將它轉換成我們熟悉的Java對象來操作的話,會使工作變得更容易一些,而xstream正好可以滿足這一點。
本文所用xstream的版本為:1.4.7
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
還是以之前的book XML為例,先上代碼。
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@XStreamAlias("book")
public class Book {
// 別名註解,這個別名就是XML文檔中的元素名,Java的屬性名不一定要與別名一致
@XStreamAlias("name")
private String name;
@XStreamAlias("author")
private String author;
// 屬性註解,此price就是book的屬性,在XML中顯示為:<book price="108">
@XStreamAsAttribute()
@XStreamAlias("price")
private String price;
省略get和set方法
}
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("books")
public class Books {
// 隱式集合,加上這個註解可以去掉book集合最外面的<list></list>這樣的標記
@XStreamImplicit
private List<Book> list;
省略get和set方法
}
Ⅵ xstream xml轉化成java對象
注意事項:
創建接收轉換的實體類 裡面欄位 與 xml節點一一對應。spring 使用@XStreamAlias("節點") 進行關聯。屬性名與節點一一對應是很重要的!!!不然 不能正常轉換。使用了註解以後,xml節點跟類的屬性名不再有關系,但是 註解裡面使用的名字就默認是與xml節點對應的。所以保持@XStreamAlias("節點") 裡面節點的值與xml 一一對應。
xstream.processAnnotations(需要轉化的實體類.class);
實體類 例子:
package com.cmsz.cmup.alipay.model.responses;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
/**
* @Title: AccountResultVO.java
* @Package com.cmsz.cmup.alipay.vo.result
* @Description: alipay返回xml字元串封裝對象
* @author yekun
* @date 2015年12月4日 上午10:50:23
*/
@XStreamAlias("alipay")
public class AccountResponseModel {
/** 錯誤信息 */
@XStreamAlias("error")
private String error;
/** 請求是否成功 */
@XStreamAlias("is_success")
private String isSuccess;
/** 請求參數 */
@XStreamAlias("request")
private Request request;
/** xml節點 */
@XStreamAlias("response")
private Response response;
/** 簽名 */
@XStreamAlias("sign")
private String sign;
/** 簽名加密方式 */
@XStreamAlias("sign_type")
private String sign_type;
//轉換代碼
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(實體類.class);
xstream.fromXML(xmlStr);//xml格式的字元串
Ⅶ xtream的工具使用
Xstream
需要的jar包
xpp3_min-1.1.4c.jar
xstream-1.3.1.jar
作用:
將xml字元串轉換為java對象,或者將java對象轉換為xml字元串
核心類:XStream xs = new XStream();
准備工作,先創建兩個java類:City和Province
@XStreamAlias("city")
public class City {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@XStreamAlias("province")
public class Province {
@XStreamAsAttribute()
private String name;
@XStreamImplicit(itemFieldName = "city")
private List citys;
public List getCitys() {
return citys;
}
public void setCitys(List citys) {
this.citys = citys;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第一:將java類轉換為xml字元串
XStream xs = new XStream();
String xml = xs.toXML(JavaBean);
列印的字元串會將類的包名作為xml的標簽,以及裡面的欄位都會變成標簽。
例如將City類變為xml字元串:
武漢
將Province變成xml字元串
湖北
武漢
所以為了能將列印的字元串變為我們所想要的格式,可以使用Xstream提供的註解進行格式化輸出
提供便捷註解
@XStreamAlias(別名) 對類和變數設置別名
@XStreamAsAttribute 設置變數生成屬性
@XStreamOmitField 設置變數 不生成到XML
@XStreamImplicit(itemFieldName = 「hobbies」) 設置集合類型變數 別名
使註解生效
xStream.autodetectAnnotations(true);
第二:將xml字元串變為java對象
Object xs.fromXML(InputStream input); //將一個下買了指定的流變為java對象
Object xs.fromXML(String xml) //將xml字元串變為java對象
Object xs.fromXML(InputStream input,Object root) ?
Object xs.fromXML(String xml,Object root) ?
注意:轉換的xml文檔必須與Java對象 的格式對應
例如:將下面xml字元串轉換為Java對象
武漢
則進行轉換時候:
XStream xs = new XStream();
Object o = xs.fromXML(in);
若對應的java格式一定是:
包名為:com.domain
類名為:City
裡面有一個成員屬性:name 提供setter/getter方法
若不是則可以使用別名:
a.為類設置別名
xs.alias("city", City.class);
b.為屬性添加別名
xstream.useAttributeFor(Blog.class,"author");
能不能通過註解將 xml轉換為制定的java對象 ?
能,手動用方法添加別名
Ⅷ 用XStream進行xml轉java對象的問題
XStream xStream = new XStream();
xStream.aliasType("LoginRsp", LoginRsp.class);
Object o = xStream.fromXML(ClassLoader.getSystemResourceAsStream("xxx.xml"));
System.out.println(o);
Ⅸ xStream轉換xml同名節點到java對象問題
假設XML文件(config/0_student.xml)內容如下:
<students>
<student>
<name>zhang3</name>
<age>20</age>
</student>
<student>
<name>li4</name>
<age>21</age>
</student>
</students>
XStream轉換代碼如下:
{
publicvoidtestToObject()throwsException{
XStreamxstream=newXStream(newDomDriver());
Filefile=newFile(XStreamUtil.class.getClassLoader().getResource("").getPath(),"config/0_student.xml");
xstream.alias("students",List.class);
xstream.alias("student",Student.class);
List<Student>students=(List<Student>)xstream.fromXML(newFileInputStream(file));
assertEquals(2,students.size());
assertEquals("zhang3",students.get(0).getName());
assertEquals("li4",students.get(1).getName());
assertEquals(20,students.get(0).getAge());
assertEquals(21,students.get(1).getAge());
}
}