使用JDK原生类实现xml序列化返序列化
package com.yh.xml; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlSchema; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.transform.stream.StreamResult; import java.io.StringReader; import java.io.StringWriter; public class XmlDemo { public static void main(String[] args) throws JAXBException { JAXBContext jc = JAXBContext.newInstance(Domain.class); //复合对象 Domain domain = new Domain(); D d = new D(); d.setParam1("p1"); d.setParam2("p2"); domain.setType("kvm"); domain.setOs("linux"); domain.setD(d); /*Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(domain, System.out);//输出到控制台*/ System.out.println("=======序列化======="); String marshal = marshal(domain.getClass(), domain); System.out.println(marshal); System.out.println("=======返序列化======="); Domain domain1 = unmarshal(marshal, Domain.class); System.out.println(domain1); } /** * 把xml配置转换成对象 * * @param xml * @param classObj * @return */ public static <T> T unmarshal(String xml, Class<T> classObj) { T obj; try { JAXBContext jaxbContext = JAXBContext.newInstance(classObj); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); obj = (T) unmarshaller.unmarshal(new StringReader(xml)); return obj; } catch (JAXBException e) { e.printStackTrace(); } return null; } /** * 把对象转换成xml配置 * * @param classObj * @param obj * @return */ public static String marshal(Class<?> classObj, Object obj) { String xmlStr = ""; try { JAXBContext jaxbContext = JAXBContext.newInstance(classObj); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串 //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息 StringWriter out = new StringWriter(); marshaller.marshal(obj, new StreamResult(out)); xmlStr = out.toString(); } catch (JAXBException e) { e.printStackTrace(); } return xmlStr; } }
bean 复合类
package com.yh.xml; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Domain { private String type; private String os; private D d; //xml 属性注解 @XmlAttribute public String getType() { return type; } public void setType(String type) { this.type = type; } public String getOs() { return os; } public void setOs(String os) { this.os = os; } public D getD() { return d; } public void setD(D d) { this.d = d; } @Override public String toString() { return "Domain{" + "type="" + type + """ + ", os="" + os + """ + ", d=" + d + "}"; } } class D { private String param1; private String param2; public String getParam1() { return param1; } public void setParam1(String param1) { this.param1 = param1; } public String getParam2() { return param2; } public void setParam2(String param2) { this.param2 = param2; } @Override public String toString() { return "D{" + "param1="" + param1 + """ + ", param2="" + param2 + """ + "}"; } }
package-info.java
位置必须是bean 所在同级包下才能生效
//命名空间 @XmlSchema(namespace="http://www.baidu.com", elementFormDefault = XmlNsForm.QUALIFIED) package com.yh.xml; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;