xstream如何将java对象转化成有cdata的xml

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xstream如何将java对象转化成有cdata的xml相关的知识,希望对你有一定的参考价值。

实体类要加注解

实体类要加注解
@XStreamAlias("msg")
public class Msg implements Serializable 

    private static final long serialVersionUID = 3196422897798539811L;
    
    @XStreamAsAttribute
    private String toUid;
    @XStreamAsAttribute
    private String fromUid;
    @XStreamAsAttribute
    private String flag;
    @XStreamAsAttribute
    private String time;
    @XStreamAlias("content")
    private String content;
    @XStreamAlias("user")
    private String user;
    //省略geter、seter

然后写个工具类
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class SerializeXmlUtil 

    /**
     * java对象转化成xml字符串
     * @param obj  java对象实例
     * @return String   xml字符串
     */
    public static String serializeToXml(Object obj) 
        //XStream xstream = new XStream();
        //直接用jaxp dom来解释
        //XStream xstream=new XStream(new DomDriver());
        //指定编码解析器,直接用jaxp dom来解释
        XStream xstream=new XStream(new DomDriver("utf-8"));
        //如果没有这句,xml中的根元素会是<包.类名>
        //或者说:注解根本就没生效,所以的元素名就是类的属性
        xstream.processAnnotations(obj.getClass());
        StringBuffer xmlstrbuf = new StringBuffer();
        xmlstrbuf.append("<?xml version=\\"1.0\\"?>");
        xmlstrbuf.append("\\r\\n");
        xmlstrbuf.append(xstream.toXML(obj));
        return xmlstrbuf.toString();
    
    
    /**
     * 将传入xml字符串转化为java对象
     * @param xmlstr
     * @param cls   xml对应的class类
     * @return T    xml对应的class类的实例对象
     * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
     */
    public static <T> T deSerizalizeFromXml(String xmlstr, Class<T> cls) throws Exception 
        //注意:不是new Xstream();否则报错:java.lang.NoClassDefFoundError:
        //org/xmlpull/v1/XmlPullParserFactory
        XStream xstream = new XStream(new DomDriver());
        xstream.processAnnotations(cls);
        T obj = (T) xstream.fromXML(xmlstr);
        return obj;
    

参考技术A private static XStream xstream = new XStream(new XppDriver() 
    public HierarchicalStreamWriter createWriter(Writer out) 
        return new PrettyPrintWriter(out) 
            // 对所有xml节点的转换都增加CDATA标记
            boolean cdata = true;
            @SuppressWarnings("unchecked")
            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);
                
            
        ;
    
);

参考技术B 网上很多。百度。

谁用过Xstream 用其生成带有cdata标签的xml解析带有cdata标签的xml

参考技术A CDATA在XML规范里代表其内部数据不要转义,即<, >等字符在内不会被解释。
解析这样的xml的时候,解释器会将其内容原样读取,不用作任何的特殊处理的。追问

我想知道的是用xstream从javabean转换成xml,生成的xml带有:列如
compareType>的标签

追答

CDATASection一般dom组件会有一个这样的对象,或者类似名称的。

writer遇到这个就会写入CDATA节点。

以上是关于xstream如何将java对象转化成有cdata的xml的主要内容,如果未能解决你的问题,请参考以下文章

xstream xml转化成java对象

谁用过Xstream 用其生成带有cdata标签的xml解析带有cdata标签的xml

xstream xml转化java时,节点大小写转化

XStream将XML转换为JAVA对象快速指南

在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法

xStream转换xml同名节点到java对象问题