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

在项目开发中有时要传输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<Class<?>> getClasses(String packagePath){
	 Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
	 String packageClassPath = packagePath.replace(".", "/")+"/**/*.class" ;
	ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
	try {
		Resource[] resources = resolver.getResources("classpath*:"+packageClassPath);
		for(int i = 0;i < resources.length;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<Class<?>> 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> T fromObjectSingle(String xml,Class<T> 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());
	}

结果:

<User ID="17" Name="c" PassWord="123"/>

c

XStream互转String和XML,以及如何读取web的下的文件,布布扣,bubuko.com

时间: 2024-10-13 22:42:59

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

利用Xstream注解生成和解析xml

实体类: @XStreamAlias("person") public class PersonBean {     @XStreamAlias("firstName")     private String firstName;     @XStreamAlias("lastName")     private String lastName;       @XStreamAlias("telphone")     priv

利用XStream实现实体类与xml的转换

package com.wanhua.util; import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver; /** * 利用XStream实现实体类与xml的转换 *  * @author w_xfpenga *  *         2014-11-27 */public class XStream2Text { static XStream xStream = new X

跨平台支持的WebService接口Demo,利用xstream快速解析和生成xml文件

原文:跨平台支持的WebService接口Demo,利用xstream快速解析和生成xml文件 源代码下载地址:http://www.zuidaima.com/share/1591110000167936.htm 这个是我本人写的CXF的WebService的一个正在项目中使用的程序, 支持跨平台,经测试,java和C#客户端能正常使用,其中利用Xstream生成和解析xml,不需要修改对象;支持内部私有字段,直接根据生成java类生成xml,反过来根据xml生成java类. 运行说明: 部署到

string转xml

//string转xml XmlDocument doc = new XmlDocument(); doc.LoadXml(temp); XmlNodeList nodes1 = doc.GetElementsByTagName("SOAP-ENV:Body"); string Result = ""; string Detail = ""; foreach (XmlElement element in nodes1)//遍历任何子节点 { Re

通过Spring工具类获取classpath下的文件资源,解析xml

File cfgFile = ResourceUtils.getFile("classpath:test.txt"); 或者 org.springframework.core.io.Resource fileRource = new ClassPathResource("test.xml"); 获取文件:fileRource.getFile(); 获取文件流:fileRource.getInputStream(); 获取到xml:进行解析:例:<myXml&g

C#之读取web上的xml

一.使用LINQ读取使用Xdocument上的Load方法,可以快速的加载一个XML文档,然后使用LINQ对 加载XML文档进行查询或其他操作,这里仅简单偏历.所以,一旦查询一组元素有返回元素集,就可以使用一个简单的foreach循环访问每一个元素.核心代码如下: /// <summary> /// 使用LINQ读取web上的xml /// </summary> public static void UseLINQ() { string sURL = "http://lo

【U1结业机试题】新闻内容管理系统:解析XML文件读取Html模版生成网页文件

一.作业要求: 1.在xml文件中创建新闻节点news,包含标题.作者.日期.正文等信息 2.创建HTML模板文件 3.读取xml中所有新闻信息,并使用新闻信息替换模板文件中占位符,从而为每一条新闻生成一个HTML静态页面 二.参考思路: 阶段1:创建xml 添加测试记录不少于三条 阶段2:创建HTML模板文件 阶段3:从xml读取新闻信息,保存在泛型集合中 阶段4:读取模板文件 训练要点: Reader类 需求说明: 读取HTML模板文件news.template,为使用新闻信息替换其中的占位

6、jsp和servlet在xml得映射和web.xml介绍

本身肯定会学的东西,今天想起来了,那就记一下吧. 做那个后端的界面时候,有人反应不要hou.jsp,说设个路由随便编乱点,别人猜不到.我也没听懂设个路由是什么意思. 最后一想,这不就是个jsp映射嘛. jsp映射和servlet映射就一条不同,servlet还可以通过@WebServlet(“”)方法. 顺便转载一下web.xml的介绍,方便以后查看 转载自:http://blog.csdn.net/believejava/article/details/43229361 Web.xml详解:

C#中使用XML指南之读取XML

? C#中使用XML指南之读取XML ? 访问的两种模型: ? 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题.流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文