`

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 {
	@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工程,有对应的测试类和源码。

2
0
分享到:
评论
6 楼 publicorprivate 2013-06-08  
[b]atwr s [/b]
5 楼 ryan_pzq 2013-03-25  
如果嵌套调用的,例如
<p>
<p></p>
</p>
这样的怎么解析,嵌套层次,位置不定
4 楼 ychengIT 2012-09-25  
不错 !!!
3 楼 yekui 2012-09-07  
大哥,有意思么?
2 楼 crawler 2012-09-05  
yjc2020 写道
用json就爽多了

xstream也支持json,不过一般存储数据以xml居多,json更多在于前后台交互。
1 楼 yjc2020 2012-09-05  
用json就爽多了

相关推荐

Global site tag (gtag.js) - Google Analytics