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

简介: 不需要生成dtd,无用配置,不需要生成辅助类,速度快。这就是xstream+xpp超强黄金组合。xstream大家都知道啦,XML Pull Parser是一种高速的 解析xml文件的方式,速度要比传统方式快很多(发现pull式解析现在比较流行了)。下面我给出多种使用方法的例子。   1.最简单的使用方法因为这个太简单,所以我从moogle的blog http://moogle.java

不需要生成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对象,肯定会出错。
相关文章
|
3天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
18 9
Java——类与对象(继承和多态)
|
3天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
17 10
Java——类与对象(封装)
|
3天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
18 9
Java——类与对象
|
5天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
4天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
4月前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
255 1
|
XML Java 数据格式
java之DocumentBuilderFactory解析xml(2)
java之DocumentBuilderFactory解析xml(2)
257 0
|
XML JavaScript Java
java之DocumentBuilderFactory解析xml(1)
java之DocumentBuilderFactory解析xml(1)
395 0
|
XML Java 数据格式