`
p7engqingyang
  • 浏览: 70856 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

xstream简介(bean与xml转换工具)

阅读更多
xstream简介(bean与xml转换工具)

本文
解决了"_"显示为"__"的问题。
解决了当xml的element属性多余bean的映射问题
解决了生成xml换行的问题

作用:
能够简单的通过
xstreamInstance.fromXML(xmlContent);   获取到对象
xstreamInstance.toXML(beanInstance);   将对象转换为xml

    官网:
    http://xstream.codehaus.org/
       
    适用场景
    bean与xml存在相互转换的场景:配置文件读取,报文解析,生成报文
    从官方的版本演进上看,还提供了hibernate,json配置文件的读取。从1.4版本以后,新加入hibernate相关处理的逻辑,该部分功能尚未详细了解。
   
    不适用场景
    xml文件较大(比如有个10M的xml文件解析,就不太适用,因一次性解析,以及生成对象将会造成内存溢出)

    效率
    经过实测对象10个属性,对应xml。
    xstream采用默认xml引擎,效率是dom4j解析的10倍左右(具体效率与代码实现有关,dom4j也能实现较高性能的解析)
    总体来说,利用xstream能够大大提高,xml解析的入门,以及编写方便

    具体事例:
   

    如何应用:
    从xstream的pom文件分析
    只需要将xstream.jar   xpp3.jar  xmlpull.jar放入项目即可
    如果为maven项目
    只需要添加:
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.3</version>
        </dependency>


    使用实例:
    例子一:
定义类
public class Person {
  private String firstname;
  private String lastname;
  private PhoneNumber phone;
  private PhoneNumber fax;
  // ... constructors and methods
}
public class PhoneNumber {
  private int code;
  private String number;
  // ... constructors and methods
}


初始化解析对象
XStream xstream = new XStream();

如果不想使用xpp作为xml解析引擎,也可写为new XStream(new Dom4jDriver());
设置映射规则:
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);


将对象序列化为xml
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));

String xml = xstream.toXML(joe);

结果:
<person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</person>


由xml生成对象
Person newJoe = (Person)xstream.fromXML(xml);


当然xstream也支持注解,一下代码中使用到了 XstreamUtils 这个是在xstream基础上的封装,解决了现在xstream在日常使用中会出现的一些问题
    @XStreamAlias("TestBeanRoot")
    class TestBean
    {
        private String testEl1;
        @XStreamAlias("test_Rename_El2")
        private String testEl2;
        @XStreamAsAttribute
        private String testAttr;
        @XStreamOmitField
        private String testSkip;
        @XStreamImplicit(itemFieldName = "itemName", keyFieldName = "keyName")
        private List<String> testList;
        ...getAndSet
    }
    XStream testBeanXstream = XstreamUtils.getXstream(XstreamUtilsTest.TestBean.class);
    XstreamUtilsTest.TestBean tt = createTestBean(); 
    System.out.println(testBeanXstream.toXML(tt));

    "<TestBeanRoot testAttr=\"attr\">"
    "<testEl1>el1</testEl1>"
  + "<test_Rename_El2>el2</test_Rename_El2>"
  + "<itemName>listItem1</itemName>"
  + "<itemName>listItem2</itemName>" 
  + "</TestBeanRoot>" 

    如果存在多级el的情况,可以通过引用其他类的形式 如 private TestBean2 testBean2;,新的类内部又可以具有其他结构

   xstream常用的注解有:
  @XStreamAlias
   @XStreamAsAttribute
   @XStreamOmitField
   @XStreamImplicit


   但看到很多文章,有这样的说法
   1、xstream有bug,在转换过程中,会将 定义别名中的下划线“_”转换为xml后会变成“__”
   2、在xml生成对象时,xml有多出来的元素时,对象生成将会抛出异常。

   事实上从xstream源代码分析,这两个都不是问题,xstream都提供了对应的处理方式

   具体参看工具类

/**
  * xstream工具封装
  * 用以处理xml与bean的转换
  * 
  * @author  PengQingyang
  * @version  [版本号, 2012-10-5]
  * @see  [相关类/方法]
  * @since  [产品/模块版本]
 */
public class XstreamUtils
{
    private static Logger logger = LoggerFactory.getLogger(XstreamUtils.class);
    
    private static Map<Class<?>, XStream> xstreamMap = new WeakHashMap<Class<?>, XStream>();
    
    /**
     * 转换过程中特殊字符转码
     */
    private static NameCoder nameCoder = new NameCoder()
    {
        public String encodeNode(String arg0)
        {
            return arg0;
        }
        
        public String encodeAttribute(String arg0)
        {
            return arg0;
        }
        
        public String decodeNode(String arg0)
        {
            return arg0;
        }
        
        public String decodeAttribute(String arg0)
        {
            return arg0;
        }
    };
    
    /**
      * 在xml中多余的节点生成bean时会抛出异常
      * 通过该mapperWrapper跳过不存在的属性
      * @param mapper
      * @return [参数说明]
      * 
      * @return MapperWrapper [返回类型说明]
      * @exception throws [异常类型] [异常说明]
      * @see [类、类#方法、类#成员]
     */
    private static MapperWrapper createSkipOverElementMapperWrapper(
            Mapper mapper)
    {
        MapperWrapper resMapper = new MapperWrapper(mapper)
        {
            /**
             * @param elementName
             * @return
             */
            @SuppressWarnings("rawtypes")
            @Override
            public Class realClass(String elementName)
            {
                Class res = null;
                ;
                try
                {
                    res = super.realClass(elementName);
                }
                catch (CannotResolveClassException e)
                {
                    logger.warn("xstream change xml to object. filed (0) not exsit. ",
                            elementName);
                }
                return res;
            }
        };
        
        return resMapper;
    }
    
    /**
     * 获取xstream转换对象
     * @param classType
     * @return [参数说明]
     * 
     * @return XStream [返回类型说明]
     * @exception throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
    */
    public static XStream getXstream(Class<?> classType)
    {
        return getXstream(classType, true);
    }
    
    /**
      * 获取xstream转换对象
      * @param classType
      * @param isSkipOverElement
      * @return [参数说明]
      * 
      * @return XStream [返回类型说明]
      * @exception throws [异常类型] [异常说明]
      * @see [类、类#方法、类#成员]
     */
    public static XStream getXstream(Class<?> classType,
            boolean isSkipOverElement)
    {
        if (xstreamMap.containsKey(classType))
        {
            return xstreamMap.get(classType);
        }
        
        XStream res = null;
        if (isSkipOverElement)
        {
            res = new XStream(new Xpp3DomDriver(nameCoder))
            {
                
                /**
                 * @param next
                 * @return
                 */
                protected MapperWrapper wrapMapper(MapperWrapper next)
                {
                    return createSkipOverElementMapperWrapper(next);
                }
                
            };
        }
        else
        {
            res = new XStream(new Xpp3DomDriver(nameCoder));
        }
        
        logger.info("create xstream by {0} , parameter {1}", new Object[] {
                classType.getName(), isSkipOverElement });
        
        res.processAnnotations(classType);
        
        xstreamMap.put(classType, res);
        
        return res;
    }
    
}


     封装后的使用:
     private static xxxxXstream = XstreamUtils.getXstream(Xxxx.class);

     method(){
        xxxxXstream.toXML
        xxxxXstream.fromXML
     }



2012-10-22追加
如果想生成的xml是否换行,自己进行控制,可这样写


/**
      *<获取xstream转换对象>
      *<功能详细描述>
      * @param classType
      * @param isSkipOverElement
      * @param isNewLine
      * @return [参数说明]
      * 
      * @return XStream [返回类型说明]
      * @exception throws [异常类型] [异常说明]
      * @see [类、类#方法、类#成员]
     */
    public static XStream getXstream(Class<?> classType,
            boolean isSkipOverElement, boolean isNewLine) {
        if (xstreamMap.containsKey(classType)) {
            return xstreamMap.get(classType);
        }
        
        /**
         * 生成domDriver 重写createWriter方法,使生成的domDriver在新的节点不会信生成一行
         */
        HierarchicalStreamDriver domDriver = null;
        if (isNewLine) {
            domDriver = new Xpp3DomDriver(nameCoder);
        } else {
            domDriver = new Xpp3DomDriver(nameCoder) {
                public HierarchicalStreamWriter createWriter(Writer out) {
                    return new PrettyPrintWriter(out, getNameCoder()) {
                        protected String getNewLine() {
                            return "";
                        }
                    };
                }
            };
        }
        
        XStream res = null;
        if (isSkipOverElement) {
            res = new XStream(domDriver) {
                protected MapperWrapper wrapMapper(MapperWrapper next) {
                    return createSkipOverElementMapperWrapper(next);
                }
            };
        } else {
            res = new XStream(domDriver);
        }
        
        logger.info("create xstream by {0} , parameter {1}", new Object[] {
                classType.getName(), isSkipOverElement });
        
        res.processAnnotations(classType);
        
        xstreamMap.put(classType, res);
        
        return res;
    }
分享到:
评论
2 楼 lizhenlzlz 2018-01-07  
对我有用,谢谢
1 楼 3740 2014-05-22  
java.lang.NoSuchMethodError: com.thoughtworks.xstream.io.xml.AbstractXmlDriver.<init>(Lcom/thoughtworks/xstream/io/naming/NameCoder;)V
at com.thoughtworks.xstream.io.xml.AbstractXppDomDriver.<init>(AbstractXppDomDriver.java:47)
at com.thoughtworks.xstream.io.xml.Xpp3DomDriver.<init>(Xpp3DomDriver.java:43)
at com.ewin.util.XstreamUtils.getXstream(XstreamUtils.java:116)
at com.ewin.util.XstreamUtils.getXstream(XstreamUtils.java:94)

相关推荐

    xstream 1.3.1.jar bean对象转换为xml

    **使用XStream进行Bean到XML转换的步骤:** 1. **引入库**:首先,你需要在项目中引入XStream库,这可以通过添加对应的jar文件(如xstream-1.3.1.jar)或者在Maven或Gradle等构建工具中配置依赖完成。 2. **创建...

    xStream xml to bean

    这个工具类的目标就是利用xStream的功能,方便地将XML文档转换为Java Bean对象,以及将Bean对象转换为XML字符串。 xStream的核心思想是通过反射和类型映射来实现对象与XML之间的转换。它使用一种称为“annoation”...

    XStream在JavaBean与XML/JSON 之间相互转换

    **XStream:JavaBean与XML/JSON之间的转换大师** XStream是一个开源库,它为Java对象提供了简单且直观的XML序列化和反序列化的解决方案。它不仅能够将Java对象转换成XML,反之亦然,还能支持JSON格式的转换。这个...

    将对象(java bean)转换为xml字符串

    XStream不仅能够将Java对象转换为XML,还可以反向将XML转换回Java对象,极大地简化了对象与XML之间的序列化和反序列化过程。 XStream库是由Johannes Lehtinen创建的一个开源项目,它是基于Java的,可以处理复杂的...

    xstream+xmlpull xml to bean &&bean to xml

    XStream是Java中一个流行的数据绑定库,它能够将Java对象序列化为XML,反之亦然,极大地简化了Java对象与XML之间的转换。XMLPull是轻量级的API,用于解析XML文档,它允许开发者以事件驱动的方式处理XML流,而无需...

    xstream 让javabean和xml互相转换

    总的来说,XStream是一个强大的工具,它使得Java对象与XML之间的转换变得简单易行。通过理解和掌握XStream的使用,开发者能够更高效地处理数据序列化问题,提高代码的可维护性和可扩展性。如果你在实际项目中遇到...

    xstream-1.3.1.jar javabean与xml之间的转化

    XStream 是一个强大的 Java 库,它允许程序员以一种简单直观的方式将 Java 对象序列化为 XML,同时也可以从 XML 文档反序列化回 ...在项目中使用 xstream-1.3.1.jar,可以轻松实现 Java 对象与 XML 文档之间的转换。

    XStream转换

    ### XML转换为Bean XStream也可以反序列化XML字符串回Java对象。以下是相应的代码: ```java String xml = "&lt;user&gt;&lt;name&gt;John&lt;/name&gt;&lt;age&gt;30&lt;/age&gt;&lt;/user&gt;"; User user = (User) xstream.fromXML(xml); ``` 在这里...

    xml与javabean之间的相互转换,很方便,导入即可使用

    总结一下,XStream是一个功能强大的工具,能够轻松地在XML与JavaBean之间进行转换,适用于需要在不同系统间传递数据或保存对象状态的场景。在MyEclipse这样的集成开发环境中,导入XStream库后,开发者可以快速上手,...

    Converter between XML and Java Bean

    总之,"Converter between XML and Java Bean"涉及的关键知识点是利用如XStream这样的库实现XML与Java对象之间的转换,这在Java开发中是非常重要且实用的技能,尤其在处理数据交换、持久化存储和跨系统通信时。...

    XML2Bean

    // 实现将XML转换为指定类型的Bean } public static String toXML(Object obj) { // 实现将Java对象转换为XML字符串 } } ``` 这个工具对于需要频繁在XML和Java对象之间转换的项目非常有用,比如在Web服务或者...

    xstream-1.4.3

    《XStream 1.4.3:Java Bean到XML与JSON转换的秘密武器》 XStream,这个小巧而强大的库,自版本1.4.3以来,一直是Java开发者处理对象序列化和反序列化的首选工具。它以其简洁的API、高效的性能和对多种格式的支持...

    xml与javabean的相互转换

    3. 第三方库:除了标准的Java库,还有许多第三方库如Apache's Digester、Castor和XStream等,它们提供了更简洁的API来简化XML与JavaBean之间的转换。 4. XMLBeans库:压缩包中的"xmlbean"可能指的是Apache的...

    XStream_1.3.chm 带 实例

    XStream是一款强大的Java库,主要用于XML序列化和反序列化,它使得XML数据与Java对象之间的转换变得简单直观。在“XStream_1.3.chm”这个压缩包中,包含了一个详细的帮助文档(通常CHM是Microsoft的HTML Help格式,...

    xstream1.4.7bin

    描述中提到的"xstream-distribution-1.4.7-bin"确认了这是一个完整的发行包,包含了将Java Bean对象转换为XML,以及从XML恢复为Java Bean的功能,同时也支持Jason(可能是JSON)的数据转换。 XStream的核心功能在于...

    XML、JAVA、JSON多种方式互相转换

    2. JSON到XML转换: - Jackson库同样提供了反向转换功能,使用`writeValueAsString`方法将JSON对象转换成XML字符串。 - 使用JsonXML Java库:这个库专门用于JSON到XML的转换,提供了简单易用的API。 - Google的...

    xstream.jar

    XStream支持直接与Java Bean的属性对应,简化映射过程。 6. **JSON支持**: 除了XML,XStream还提供了对JSON的支持,只需添加相应的转换器即可。 ### 四、最佳实践 1. **避免默认类型转换**: 尽量避免使用...

    json、javaBean、xml互转的几种工具介绍

    对于XML转换,Jackson有一个名为`JAXB`的模块,可以处理XML与Java对象之间的转换。 3. **JAXB (Java Architecture for XML Binding)** JAXB是Java SE的一部分,用于将Java对象绑定到XML。它支持XML到JavaBean的...

    XStream使用方法总结附实例代码

    总之,`XStream`是Java开发中处理对象与XML之间转换的强大工具,它的灵活性和易用性使其成为数据交换和序列化的理想选择。正确理解和使用别名配置以及自定义转换器,可以让开发者更好地掌控XML数据的表示和解析过程...

    JavaBean 转换为xml的三种方式比较

    - **XMLEncoder**是最基础的实现,适合简单的XML转换,但缺乏灵活性。 - **Apache Commons BeanUtils**提供了更多自定义选项,但可能需要额外的配置和代码。 - **XStream**是功能最全面的库,支持高级映射和定制,...

Global site tag (gtag.js) - Google Analytics