首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

xml跟实体对象相互转换 一步到位

2012-12-19 
xml和实体对象相互转换 一步到位用Xstream完成xml与对象之间的相互转换,我在xstream包的基础上简单的封装

xml和实体对象相互转换 一步到位

用Xstream完成xml与对象之间的相互转换,我在xstream包的基础上简单的封装了一下:

如以下xml:

<?xml version="1.0" encoding="UTF-8"?><html>  <body>    <div id="div1" name="div"/>    <form action="saveForm.asp" method="post">      <h1>请输入您的联系信息:</h1>      <lable>名字:</lable>      <p>        <input type="submit" id="btn_sub" name="btn_sub" value="Submit"/>        <input type="reset" id="btn_res" name="btn_res" value="Reset"/>      </p>    </form>  </body></html>

?想快速转换成对象。

?

第一步将xml分解成不同的对象如下,HtmlBean 为主体对象:

?<html>标签:?

@XStreamAlias("html")public class HtmlBean implements BaseConverterBean {private HtmlBody body;public HtmlBody getBody() {return body;}public void setBody(HtmlBody body) {this.body = body;}}

?

<body>标签:

@XStreamAlias("body")public class HtmlBody implements BaseConverterBean {private HtmlDiv div;private HtmlForm form;public HtmlForm getForm() {return form;}public void setForm(HtmlForm form) {this.form = form;}public HtmlDiv getDiv() {return div;}public void setDiv(HtmlDiv div) {this.div = div;}}

?<div>标签:

@XStreamAlias("div")public class HtmlDiv implements BaseConverterBean {@XStreamAsAttributeprivate String id;@XStreamAsAttributeprivate String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

?

<form>标签:

@XStreamAlias("form")public class HtmlForm implements BaseConverterBean {@XStreamAsAttributeprivate String action;@XStreamAsAttributeprivate String method;private String h1;private String lable;private HtmlP p;public String getAction() {return action;}public void setAction(String action) {this.action = action;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getH1() {return h1;}public void setH1(String h1) {this.h1 = h1;}public String getLable() {return lable;}public void setLable(String lable) {this.lable = lable;}public HtmlP getP() {return p;}public void setP(HtmlP p) {this.p = p;}}

?<p>标签:

@XStreamAlias("p")public class HtmlP implements BaseConverterBean {@XStreamImplicitprivate List<HtmlInput> input;public List<HtmlInput> getInput() {return input;}public void setInput(List<HtmlInput> input) {this.input = input;}}

?

<input>标签:

@XStreamAlias("input")public class HtmlInput implements BaseConverterBean {@XStreamAsAttributeprivate String type;@XStreamAsAttributeprivate String id;@XStreamAsAttributeprivate String name;@XStreamAsAttributeprivate String value;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}

?

第二步:利用xstream将xml文件转换为对象HtmlBean :

public class XMLToBeanConverterTest {@Beforepublic void setUp() throws Exception {}@Afterpublic void tearDown() throws Exception {}@Testpublic void testToBean() {HtmlBean bean = null;XStream xstream = XstreamUtil.getDriverInstace();String xml = getResourceFileContent(XMLToBeanConverterTest.class, "html.xml");if(xml!=null && !"".equals(xml)){bean = (HtmlBean)ConverterFactory.getXMLToBeanConverterInstance(xml).stringToBean(xstream, HtmlBean.class, true);}String divid = bean.getBody().getDiv().getId();String expected = "div1";assertEquals(expected, divid);}    @SuppressWarnings("unchecked")public static String getResourceFileContent(Class c,String name){    StringBuffer sb = new StringBuffer();    try {    InputStream input = c.getClassLoader().getResourceAsStream(name);    BufferedReader reader = new BufferedReader(new InputStreamReader(input,"UTF-8"));    String line = null;    while ((line = reader.readLine()) != null) {    sb.append(line);    }    reader.close();    input.close();    } catch (Exception e) {    e.printStackTrace();    }    return sb.toString();    }}

?

ConverterFactory:

/** * 转换器工厂 *  * @author crawler *  */public class ConverterFactory {/** * 获得BeanToXMLConverter实例化对象 *  * @param bean  实体Bean对象 *            * @return BeanToXMLConverter 实例化对象 */public static XMLConverter getBeanToXMLConverterInstance(BaseConverterBean bean) {return new BeanToXMLConverter(bean);}public static BeanConverter getXMLToBeanConverterInstance(String xml) {return new XMLToBeanConverter(xml);}}

?XMLToBeanConverter:

/** * xml转换为对应的实体bean对象 *  * @author crawler *  */public class XMLToBeanConverter implements BeanConverter {private String xml;public XMLToBeanConverter(String xml){this.xml = xml;}@SuppressWarnings("unchecked")public BaseConverterBean stringToBean(XStream xstream,Class type,boolean isAttribute) {if(isAttribute){xstream.processAnnotations(type);}return (BaseConverterBean)xstream.fromXML(xml);}}

??

第三步:将bean对象转换成xml:

public class BeanToXMLConverterTest {@Beforepublic void setUp() throws Exception {}@Afterpublic void tearDown() throws Exception {}@Testpublic void testToXml() {HtmlBean bean = new HtmlBean();HtmlBody body = new HtmlBody();HtmlDiv div = new HtmlDiv();HtmlForm form = new HtmlForm();HtmlP p = new HtmlP();List<HtmlInput> inputs = new ArrayList<HtmlInput>();HtmlInput input = new HtmlInput();input.setId("btn_sub");input.setType("submit");input.setName("btn_sub");input.setValue("Submit");HtmlInput input2 = new HtmlInput();input2.setId("btn_res");input2.setType("reset");input2.setName("btn_res");input2.setValue("Reset");inputs.add(input);inputs.add(input2);p.setInput(inputs);div.setId("div1");div.setName("div");form.setAction("saveForm.asp");form.setH1("请输入您的联系信息:");form.setLable("名字:");form.setMethod("post");form.setP(p);body.setDiv(div);body.setForm(form);bean.setBody(body);XMLConverter converter = ConverterFactory.getBeanToXMLConverterInstance(bean);XStream xstream = XstreamUtil.getInstance();// 将对象转换为xml文件String xml = converter.toXml(xstream, bean.getClass(), true);Document doc = null;try {doc = DocumentHelper.parseText(xml);} catch (DocumentException e) {e.printStackTrace();}if(doc!=null){xml = doc.asXML();}System.out.println(xml);}}

?

BeanToXMLConverter:

/** * 将bean对象转换为xml形式的转换器 *  * @author crawler *  */public class BeanToXMLConverter implements XMLConverter {private BaseConverterBean bean;public BeanToXMLConverter(BaseConverterBean bean) {this.bean = bean;}@SuppressWarnings("unchecked")public String toXml(XStream xstream,Class type,boolean isAttribute) {if(isAttribute){xstream.processAnnotations(type);}return xstream.toXML(bean);}}

?

打印结果:

<?xml version="1.0" encoding="UTF-8"?><html>  <body>    <div id="div1" name="div"/>    <form action="saveForm.asp" method="post">      <h1>请输入您的联系信息:</h1>      <lable>名字:</lable>      <p>        <input type="submit" id="btn_sub" name="btn_sub" value="Submit"/>        <input type="reset" id="btn_res" name="btn_res" value="Reset"/>      </p>    </form>  </body></html>

?

与顶部的xml完全一致。这样就完成了相互的转换很方便。

如果需要可以下载附件我贴上了我的Myeclipse工程,有对应的测试类和源码。

1 楼 yjc2020 2012-09-05   用json就爽多了 2 楼 crawler 2012-09-05   yjc2020 写道用json就爽多了
xstream也支持json,不过一般存储数据以xml居多,json更多在于前后台交互。 3 楼 yekui 2012-09-07   大哥,有意思么? 4 楼 ychengIT 2012-09-25   不错 !!!

热点排行