XML和javabean相互转换
public static String beanToXML(Class c , Object object) throws JAXBException { String xml = null; JAXBContext context = JAXBContext.newInstance(c); Marshaller m =context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); Writer w = new StringWriter(); m.marshal(object, w); xml = w.toString(); return xml; }
public static <javaBean> bean xmlToBean(String xml, javaBean bean) throws JAXBException{ JAXBContext context = JAXBContext.newInstance(bean.getClass()); Unmarshaller um =context.createUnmarshaller(); StringReader sr = new StringReader(xml); bean = (javaBean)um.unmarshal(sr); return bean; }
另外还有一种:Castor实现XML与Java的互转。
下面写个简单例子,测试下Castor:
bean:
package ex1; import java.io.Serializable; import java.util.*; public class Foo implements Serializable { private String name; private Date birthday = new Date(); private List adds = new ArrayList(0); private Map map = new HashMap(0); public Foo() { } public Foo(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public List getAdds() { return adds; } public void setAdds(List adds) { this.adds = adds; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } }
test类:
package ex1; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import java.io.FileReader; import java.io.FileWriter; import java.util.Map; public class MarshalTester { public static void main(String[] args) { testMarshaller(); testUnMarshaller(); } /** * java->XML */ public static void testMarshaller() { try { Foo f = new Foo("foo"); f.getAdds().add("zhengzhou"); f.getAdds().add("xian"); f.getMap().put("a", "aaa"); f.getMap().put("b", "bbb"); FileWriter writer = new FileWriter("foo.xml"); Marshaller marshaller = new Marshaller(writer); marshaller.setEncoding("GBK"); marshaller.marshal(f); } catch (Exception e) { e.printStackTrace(System.err); } } /** * XML->java */ public static void testUnMarshaller() { try { FileReader reader = new FileReader("D:\\teststu\\testcastor\\foo.xml"); Foo foo = (Foo) Unmarshaller.unmarshal(Foo.class, reader); System.out.println("Name: " + foo.getName()); System.out.println("Birthday: " + foo.getBirthday()); for (Object s : foo.getAdds()) { System.out.println("Add: " + s.toString()); } for (Object o : foo.getMap().entrySet()) { Map.Entry e = (Map.Entry) o; System.out.println("Map: " + e.getKey() + "--" + e.getValue()); } } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(System.err); } } }
生成的xml文件如下:
foo.xml
<?xml version="1.0" encoding="GBK"?> <foo> <name>foo</name> <birthday>2010-04-30T18:01:59.375+08:00</birthday> <map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:org.exolab.castor.mapping.MapItem"> <key xsi:type="java:java.lang.String">a</key> <value xsi:type="java:java.lang.String">aaa</value> </map> <map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:org.exolab.castor.mapping.MapItem"> <key xsi:type="java:java.lang.String">b</key> <value xsi:type="java:java.lang.String">bbb</value> </map> <adds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:java.lang.String">zhengzhou </adds> <adds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:java.lang.String">xian </adds> </foo>
运行反解组测试方法:
log4j:WARN No appenders could be found for logger (org.castor.core.util.AbstractProperties).
log4j:WARN Please initialize the log4j system properly.
Name: foo
Birthday: Fri Apr 30 18:01:59 CST 2010
Add: zhengzhou
Add: xian
Map: a–aaa
Map: b–bbb
Process finished with exit code 0
黄色部分是有效输出!