欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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