Java对象转换XML文件:XStream+XPP

不需要生成dtd,无用配置,不需要生成辅助类,速度快。这就是xstream+xpp超强黄金组合。
xstream大家都知道啦,XML Pull Parser是一种高速的 解析xml文件的方式,速度要比传统方式快很多(发现pull式解析现在比较流行了)。下面我给出多种使用方法的例子。



 

1.最简单的使用方法
因为这个太简单,所以我从moogle的blog http://moogle.javaeye.com/blog/34661取下面的例子
   1.  public static void write() {  
   2.     XStream sm = new XStream();  
   3.     mytest t = new mytest();  
   4.     t.setName("moogle");  
   5.     t.setXb("男");  
   6.     try {  
   7.     FileOutputStream ops = new FileOutputStream(new File("C://111.xml"));  
   8.     sm.toXML(t, ops);  
   9.     ops.close();  
  10.     } catch (Exception e) {  
  11.         e.printStackTrace();  
  12.     }  
  13. }     
  14. public static void read() {  
  15.     XStream sm = new XStream(new DomDriver());  
  16.     try {  
  17.         FileInputStream ops = new FileInputStream(new File("C://111.xml"));  
  18.         mytest t = (mytest)sm.fromXML(ops);  
  19.         System.out.println(t.getName());  
  20.         ops.close();  
  21.         } catch (Exception e) {  
  22.             e.printStackTrace();  
  23.         }         
  24. }

生成 XML是
# <mytest> 
#   <name>asd</name> 
#   <xb>男</xb>



 
2.中等方法(需要1.2版以上才有这个功能)
XStream stream = new XStream();
stream.alias("schema", SchemaObject.class);
stream.useAttributeFor("url", String.class);
stream.useAttributeFor("jdbcDriverClass", String.class);
stream.useAttributeFor("user", String.class);
stream.useAttributeFor("password", String.class);
FileOutputStream s = new FileOutputStream(file);
stream.toXML(theObject, s);
s.close();
alias和useAttributeFor是用作把 <com.hongsoft.model.SchemaObject>修改为<schema>



 

3.高级方法
XStream stream = new XStream();
stream.registerConverter(new SchemaXMLConvertor());
stream.alias("schema", SchemaObject.class);
FileInputStream s = new FileInputStream(file);
object = (SchemaObject) stream.fromXML(s);
s.close();

 

registerConverter可以实现把任何schema的XML和object互相转换,这个其实已经否定了很多朋友说的
“xstream+xpp”功能不强的说法。SchemaXMLConvertor示例如下:

 

public void marshal(Object arg0, HierarchicalStreamWriter writer,
            MarshallingContext arg2) {
    SchemaObject schema=(SchemaObject)arg0;       
    writer.startNode(SchemaObject.TABLE);
    writer.addAttribute(SchemaObject.TABLE_NAME, iTable.getName());
    //line           
    List<SchemaObject.TableObject.LineObject> lines=iTable.getLines();
    for(int j=0;j<lines.size();j++)
    {
        SchemaObject.TableObject.LineObject jLine=lines.get(j);
        writer.startNode(SchemaObject.LINE);
        //column
        Map<String,String> columns=jLine.getColumns();
        Iterator ite=columns.keySet().iterator();
        while(ite.hasNext())
        {
            String columnName=ite.next().toString();
            writer.addAttribute(columnName, columns.get(columnName));
        }
        writer.endNode();
        }
        writer.endNode();
        writer.underlyingWriter();
    }

public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext arg1) {
    SchemaObject schema=new SchemaObject();
    schema.setJdbcDriverClass(reader.getAttribute(SchemaObject.JDBC_DRIVER_CLASS));
    schema.setUrl(reader.getAttribute(SchemaObject.URL));
    schema.setUser(reader.getAttribute(SchemaObject.USER));
    schema.setPassword(reader.getAttribute(SchemaObject.PASSWORD));
    List<TableObject> tables = new ArrayList<TableObject>();
        while(reader.hasMoreChildren()) {
            reader.moveDown();
            SchemaObject.TableObject table=new SchemaObject().new TableObject();
            table.setName(reader.getAttribute(SchemaObject.TABLE_NAME));
            tables.add(table);
            reader.moveUp();
        }
        schema.setTables(tables);       
        return schema;
}
public boolean canConvert(Class arg0) {
    return arg0.equals(SchemaObject.class);
}

 

 

 

说明:

1、XStream不要求Java类的属性必须有getter、setter方法,因此省略。

 

2、设置java成员属性别名

        xStream.aliasField("Investor-List",MainBody.class,"investorList");

        outXML(3,xStream,mainBody);

运行结果会产生:

  <Investor-List>

 

3、将java成员映射为xml元素的一个属性

 

        //将name成员作为属性添加到Investor对应xml节点里       

        xStream.useAttributeFor(Investor.class,"name");

 

运行结果会产生:

            <Investor name="hahhah">

 

 

下面这两句是相关联的:

        xStream.aliasAttribute(Investor.class,"name","GDXM");

        xStream.useAttributeFor(Investor.class,"name");

        意思是先为java成员定义个别名,然后在将别名应用于xml属性上。

 

运行结果会产生:

            <Investor GDXM="hahhah">

 

这些问题虽然解决了,但又发现了新的问题:xml转java时,当java中没有定义xml元素节点时,这时候会抛出异常。也许通过XStream本身的API可以解决,也许是XStream本身所不能处理的问题,时间有限,也没来得及深究。有知道的朋友,还望留言。

 

4、再进行xml到java 的转换过程中,XStream对象别名可以定义很多,涵盖的类的范围超过xml所能表达的范围,这个也没有关系,XStream还是会忠实地将xml还原为对象。但是如果xml范围大于XStream所涵盖类的范围,那么转换过程会出错。比如,要将一个Investor节点转换为ManiBody对象,肯定会出错。

时间: 2024-07-29 11:48:50

Java对象转换XML文件:XStream+XPP的相关文章

JAVA对象和XML文件绑定

目的     在日常工作中,我们经常处理这些编组关系:JAVA对象 <--> XML文件:JAVA对象 <--> 数据库表.本文简单介绍一下JAVA对象和XML文件之间的绑定.虽然代码简单,但解决问题的广度与思路也是非常重要的.     首先,在Maven中引入要用到的jar包. <dependency> <groupId>castor</groupId> <artifactId>castor</artifactId> &

Java对象与XML文件之间相互转化(含源代码)

java对象|xml|源代码 要求:JDK1.4以上 下载:http://spaner.zj.com示例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3

使用Quick在Java对象和XML之间进行转换

近几年来,XML 的确给编程世界带来了巨大冲击.然而,XML 应用程序的复杂 性(从一开始就很复杂)在最近几年中并没有减少多少.开发人员仍要花几个星 期的时间(即使不是几个月)来学习复杂的 XML 语义和 API(如 SAX 和 DOM) 来操作 XML.然而,在过去的 6 个月到 12 个月中,相对于那些较复杂的 API, 另一种新的比较简单的 XML API(称为 Quick)已经越来越受到欢迎. 数据绑定允许您直接在 Java 对象和 XML 之间映射,而不必处理 XML 属性和 元素.另

XML的操作——JAXB进行Java对象和XML之间的转换

JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具,可实现Java对象与XML的相互转换. 在JAXB中将一个Java对象-->XML的过程称之为Marshal,XML-->Java对象的过程称之为UnMarshal. @XmlRootElement public class SClass {private String cnum;private List<Student> students;public SClass()

java遍历读取xml文件内容_java

本文实例讲解了java遍历读取xml文件内容的详细代码,分享给大家供大家参考,具体内容如下 package test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; imp

json与java对象转换的问题

问题描述 json与java对象转换的问题 请问一下这样的json字符串如何转化为java对象呢? json字符串: "{"post":{"userId":"1","postId":"2"}}" 如果post后面是一个json字符串,那一点问题都没有,但是post后面是一个json对象,这要怎么解析呢?我的javabean是Post.求大神帮忙- 解决方案 Json是标记语言,到任何语言

java 解析xml文件-在JAVA中解析XML文件时遇上难题,向各位大虾求助。

问题描述 在JAVA中解析XML文件时遇上难题,向各位大虾求助. 在服务器进程中编写登录时出现以下错误提示: Exception in thread "Thread-0" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl cannot be cast to javax.swing.text.Document at server.ServerThread.Lo

快速通过XSL转换XML文件

XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表.排版样式表分:CSS和XSL.其中XSL非常适合XML.   最近,我喜欢上了XML编程,但又苦于它的美观程度又不够,找了许多书才搞定. 用XML好是蛮好,但它还是不太适合做显示数据的语言.(比起HTML要查多了!) XML文件作出来的东西看起来并不是那么美观,但还是可以找到补救的方法. XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表. 排版样式表分:CSS和XSL.其中XSL非常适合XML.(在这里

如何快速通过XSL转换XML文件

xml|转换 最近,我喜欢上了XML编程,但又苦于它的美观程度又不够,找了许多书才搞定. 用XML好是蛮好,但它还是不太适合做显示数据的语言.(比起HTML要查多了!) XML文件作出来的东西看起来并不是那么美观,但还是可以找到补救的方法. XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表. 排版样式表分:CSS和XSL.其中XSL非常适合XML.(在这里不讨论CSS!) 现在开始转换吧! XSL包含两大部分:XSLT和XSL Formatting Object XSLT(