您的位置:首页 > 编程语言 > Java开发

XStream的简单使用

2017-12-27 10:29 363 查看
本文主要介绍了常用的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------&
4000
gt;XML

TestBean bean = new TestBean();
//bean.set.....;
String xml = XmlUtils.toXmlWithHeader(bean);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml javabean java XStream class