XStream的简单使用

本文主要介绍了常用的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);


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值