xml和实体对象相互转换 一步到位 博客分类: J2EEXML javaxmlxstream转换
程序员文章站
2024-03-24 21:12:46
...
用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 { @XStreamAsAttribute private String id; @XStreamAsAttribute private 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 { @XStreamAsAttribute private String action; @XStreamAsAttribute private 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 { @XStreamImplicit private 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 { @XStreamAsAttribute private String type; @XStreamAsAttribute private String id; @XStreamAsAttribute private String name; @XStreamAsAttribute private 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 { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public 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 { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public 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工程,有对应的测试类和源码。