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对象,肯定会出错。
相关文章
|
10月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
378 1
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
359 9
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
584 2
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
535 14
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
435 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
4061 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
733 5
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
368 0
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
817 0
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现