热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XStream互转String和XML,以及如何读取web的下的文件

在项目开发中有时要传输xm文件,要转换成字符串传输,而无法使用对象传输,所以要进行转换,所用进行总结下利用XStream进行string与XML对象之间的互转,以及在转换某一包下所有的类。XML文件的

在项目开发中有时要传输xm文件,要转换成字符串传输,而无法使用对象传输,所以要进行转换,所用进行总结下利用XStream进行string与XML对象之间的互转,以及在转换某一包下所有的类。

XML文件的解析和创建,请参考:http://blog.csdn.net/oyyz111/article/details/22730983

首先,利用Spring的PathMatchingResourcePatternResolver进行某包下的class文件的读取,其中用ant的匹配模式,例如congfig/**/*.class,是匹配config文件下一个目录或多个目录下的class文件,config/a/a.class或者config/a/b/b.class

代码如下:

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;

import org.apache.log4j.Logger;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

public class AchieveFileUtils {
private static Logger logger = Logger.getLogger(AchieveFileUtils.class);

/**
* 获取某包下所有类的实例
* @param packagePath 包名
* @return class集合
*/
public static Set> getClasses(String packagePath){
Set> classes = new LinkedHashSet>();
String packageClassPath = packagePath.replace(".", "/")+"/**/*.class" ;
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
Resource[] resources = resolver.getResources("classpath*:"+packageClassPath);
for(int i = 0;i Resource resource = resources[i];
String completeFilePath = resource.getFile().getPath().replace(File.separator, "/");
logger.info("completeFilePath:"+completeFilePath);
String className = completeFilePath.substring(completeFilePath.lastIndexOf(packagePath.replace(".", "/")), completeFilePath.length()-6);
try {
classes.add(Class.forName(className.replace("/", ".")));
} catch (ClassNotFoundException e) {
logger.error("没有加载到此类");
logger.error(e.getMessage(), e.getCause());
}
logger.info("className:"+className);
}
} catch (IOException e) {
logger.error(e.getMessage(), e.getCause());
}
return classes;
}

}

XStream转换XML为对象,是需要对象的class的,所以前者获取class文件为后面的转换做铺垫

要转换的对象实例,User.java


@XStreamAlias("User") 表示别名


@XStreamAsAttribute 表示作为属性

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;


@XStreamAlias("User")
public class User {
@XStreamAsAttribute
@XStreamAlias("ID")
private int id;
@XStreamAlias("Name")
@XStreamAsAttribute
private String name;
@XStreamAlias("PassWord")
@XStreamAsAttribute
private String password;


public int getId() {
return id;
}


public void setId(int id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getPassword() {
return password;
}


public void setPassword(String password) {
this.password = password;
}


}

private XStream xstream = new XStream(new XppDriver(newXmlFriendlyNameCoder("_-", "_")));

如果没有new XppDriver(new XmlFriendlyNameCoder("_-", "_")),,

别名取的是@XStreamAlias("ID_"),就被解析成@XStreamAlias("ID__")


xstream.processAnnotations(clazz);将要转换的class进行扫描


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Set;

import org.apache.log4j.Logger;



import com.frame.model.User;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;

public class XStreamUtils {
private static Logger logger = Logger.getLogger(XStreamUtils.class);
private XStream xstream = new XStream(new XppDriver(
new XmlFriendlyNameCoder("_-", "_")));
public static XStreamUtils xStreamUtils = null;

/**
* 获取唯一的实例对象,通过双层锁
* @param packagePath 包名
* @return XStreamUtils对象
*/
public static XStreamUtils getInstance(String packagePath) {
if (xStreamUtils == null) {
synchronized (XStreamUtils.class) {
if (xStreamUtils == null) {
xStreamUtils = new XStreamUtils(packagePath);
}
}
}
return xStreamUtils;
}

/**
* 获取唯一的实例对象,通过双层锁
* @return XStreamUtils对象
*/
public static XStreamUtils getInstance(){
if(xStreamUtils == null){
synchronized (XStreamUtils.class) {
if(xStreamUtils == null)
xStreamUtils = new XStreamUtils();
}
}
return xStreamUtils;
}

/**
* XStreamUtils 构造方法
* @param packagePath
*/
private XStreamUtils(String packagePath) {
this.initXStream(packagePath);
}
/**
* 无参数构造
* XStreamUtils 构造方法
*/
private XStreamUtils() {

}

/**
* 根据传入的包名,将包下所有标有XStreamAlias注解的类进行扫描
* @param packagePath 包名
 
*/
private void initXStream(String packagePath) {
xstream.autodetectAnnotations(true);
Set> classes = AchieveFileUtils.getClasses(packagePath);
for (Class clazz : classes) {
Annotation annotation = clazz.getAnnotation(XStreamAlias.class);
if (annotation != null) {
xstream.processAnnotations(clazz);
} else {
for (Field field : clazz.getFields()) {
Annotation annotatiOnFiled= field
.getAnnotation(XStreamAlias.class);
if (annotationFiled != null) {
xstream.processAnnotations(clazz);
break;
}
}
}
}
}

/**
* 将包下的object转换成string xml形式,object的class已经初始化了。
* @param obj 要转换的对象
* @return 字符串
*/
public String toXml(Object obj) {
return xstream.toXML(obj);
}

/**
* 将某一对象转换成string xml形式
* @param obj 要转换的对象
* @return 字符串的xml
*/
public String toXmlSingle(Object obj){
xstream.processAnnotations(obj.getClass());
return xstream.toXML(obj);
}

/**
* 将string的xml字符串转换成对象
* @param xml 要转换的string
* @param clazz 要转换成相应的clazz对象
* @return 转换后的对象
*/
public T fromObjectSingle(String xml,Class clazz){
xstream.processAnnotations(clazz);
T object = (T)xstream.fromXML(xml);
return object;
}

/**
* 将包下string的xml转换成对象,对象的class已经初始化
* @param xml 要进行转换的string
* @return 转换后的对象
*/
public Object fromObject(String xml) {
return xstream.fromXML(xml);
}
}

测试代码:

public static void main(String[] args) {
//XStreamUtils x = XStreamUtils.getInstance();
XStreamUtils x = XStreamUtils.getInstance("com.frame.model");
User user = new User();
user.setId(17);
user.setName("c");
user.setPassword("123");
//String stringXml = x.toXmlSingle(user);
String stringXml = x.toXml(user);
System.out.println(stringXml);
// User sUser = x.fromObjectSingle(stringXml, User.class);
User sUser = (User) x.fromObject(stringXml);
System.out.println(sUser.getName());
}

结果:


c


推荐阅读
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务
    java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务第三步java实现 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
author-avatar
阿日小子很顽强_756
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有