本文主要介绍了常用的XML节点与Java Bean之间的映射。
主要文件有,XML字符串,XML对应的JavaBean,XmlUtils.java ,XStreamEx.java(该类用于解决Xml存在节点,而JavaBBean中不存在就会报错的情况)
所需要的依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
<!--XmlUtils使用到该包的类-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.3</version>
</dependency>
1.XML字符串
<?xml version="1.0" ?>
<siiscmd xmlns="http://www.aisino.sh.cn">
<issueinv>
<invrecord>
<invrecordhead>
<machinetaxnr>31010105298235X</machinetaxnr>
<machinenr>0</machinenr>
<invkind>
<value>0</value>
</invkind>
<docnr>910000370</docnr>
</invrecordhead>
<invrecorditem>
<prodnr>10023</prodnr>
</invrecorditem>
<invrecorditem>
<prodnr>10024</prodnr>
</invrecorditem>
</invrecord>
</issueinv>
</siiscmd>
2.XML对应的Java Bean(省略get/set方法) TestBean.java
@XStreamAlias("siiscmd")
public class TestBean {
@XStreamAsAttribute
private String xmlns = "http://www.aisino.sh.cn";
@XStreamAlias("issueinv")
private Issueinv issueinv;
class Issueinv{
@XStreamAlias("invrecord")
private Invrecord invrecord;
}
class Invrecord {
@XStreamAlias("invrecordhead")
private Invrecordhead invrecordhead;
@XStreamImplicit(itemFieldName = "invrecorditem")
private List<Invrecorditem> invrecorditemList;
}
class Invrecordhead{
@XStreamAlias("machinetaxnr")
private String machinetaxnr;
@XStreamAlias("machinenr")
private String machinenr;
@XStreamAlias("invkind")
private Invkind invkind;
@XStreamAlias("docnr")
private String docnr;
}
class Invrecorditem{
@XStreamAlias("prodnr")
private String prodnr;
}
class Invkind{
@XStreamAlias("value")
private String value;
}
}
3.XmlUtils.java
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.CompactWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import org.apache.commons.lang.StringEscapeUtils;
import java.io.StringWriter;
import java.io.Writer;
/**
* Xml解析工具类
* Created by zx on 2017/11/14 15:54
*/
public class XmlUtils {
//xstream扩展
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点都增加CDATA标记
boolean cdata = true;
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
/**
* 生成压缩的xml字符串
* @param obj
* @return
*/
public static String toXml(Object obj) {
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解
// 以压缩的方式输出XML
StringWriter sw = new StringWriter();
xstream.marshal(obj, new CompactWriter(sw));
return sw.toString();
// 以格式化的方式输出XML
//return xstream.toXML(obj);
}
/**
* 带有头信息的xml字符串
* @param obj
* @return
*/
public static String toXmlWithHeader(Object obj) {
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解
// 以压缩的方式输出XML
StringWriter sw = new StringWriter();
xstream.marshal(obj, new CompactWriter(sw));
return header+sw.toString();
// 以格式化的方式输出XML
//return xstream.toXML(obj);
}
/**
* 带有头信息的xml字符串
* @param obj
* @return
*/
public static String toXmlWithHeaderUnescapeXml(Object obj) {
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解
// 以压缩的方式输出XML
StringWriter sw = new StringWriter();
xstream.marshal(obj, new CompactWriter(sw));
return StringEscapeUtils.unescapeXml(header+sw.toString());
// 以格式化的方式输出XML
//return xstream.toXML(obj);
}
/**
* 将xml字符串映射称对象
* @param xmlStr
* @param cls
* @param <T>
* @return
*/
public static <T> T toBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStreamEx(new DomDriver());
xstream.processAnnotations(cls);
@SuppressWarnings("unchecked")
T t = (T) xstream.fromXML(xmlStr);
return t;
}
}
4.XSteamEx.java
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.mapper.MapperWrapper;
/**
* 忽略xml中存在节点,而model中不存在,就会报错.
* Created by zx on 2017/11/24 16:35
*/
public class XStreamEx extends XStream {
public XStreamEx(DomDriver domDriver) {
super(domDriver);
}
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {
@Override
public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn,
String fieldName) {
if (definedIn == Object.class) {
return false;
}
return super.shouldSerializeMember(definedIn, fieldName);
}
};
}
}
5.XmlUtils的使用
XML------>Java Bean
String xml = "xml字符串....";
TestBean testBean = XmlUtils.toBean(xml, TestBean.class);
Java Bean------>XML
TestBean bean = new TestBean();
//bean.set.....;
String xml = XmlUtils.toXmlWithHeader(bean);