`

xstream学习小结

阅读更多
    在XML跟普通POJO的序列化过程中,有很多的方法,其中发现xstream这个包还是不错的,它的作者是大名鼎鼎的thoughtworks写的,下面简单分析下。

1 首先是POJO对象,比如:
   public class Employee {
private String name;
private String designation;
private String department;
  。。。。。。。。。。

2 把POJO变成XML对象
  XStream xstream=new XStream(new DomDriver());
   xstream.alias("employee",Employee.class);
  strxml=xstream.toXML(person);
  System.out.println(strxml);

3 把XML对象反序列化为POJO对象
   String str="....."//XML
  Employee employee=(Employee)xstream.fromXML(str);
  System.out.println("姓名:"+employee.getName());
4 另外附上一个比较复杂的精彩例子:
   public class XmlParser {
private static final Log log = LogFactory.getLog(XmlParser.class);

private static final String DEFAULT_ENCODING = "UTF-8";

/**
* 获取 XML 文件头 encoding 中指定字符集的查询匹配器。
*/
private static Pattern encodingPattern = Pattern.compile("<\\?xml.*\\s+encoding\\s*=\\s*[\"']?([\\w\\-_]+)[\"'\\s?><]", Pattern.DOTALL + Pattern.CASE_INSENSITIVE);

private static CustomXppDriver driver = new CustomXppDriver(new CustomReplacer());

private static boolean flat;

private static boolean notList;

/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parseXmlFile(String fileName) throws FileNotFoundException, UnsupportedEncodingException {
return parse(new File(fileName));
}

/**
* 将 XML 文件解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException {
Reader reader = null;
try {
reader = getXmlEncodingReader(new FileInputStream(xmlFile));
return parse(reader);
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception ignore) {
}
}
}
}

/**
* 将 XML 字节数组解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
*/
public static Map parse(byte[] xmlBytes) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(new ByteArrayInputStream(xmlBytes)));
}

/**
* 将 XML 字节数组,按照指定字符集解析为 Map 集合数据。
*/
public static Map parse(byte[] xmlBytes, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(new ByteArrayInputStream(xmlBytes), encoding);
return getData(reader);
}

/**
* 将 XML 字符串,解析为 Map 集合数据。
* @param xmlStr 字符串
* @return 集合数据
*/
public static Map parse(String xmlStr) {
return parse(new StringReader(xmlStr));
}

/**
* 将 XML 字节流,解析为 Map 集合数据,使用 XML 内容指定的字符集进行编码解析 */
public static Map parse(InputStream xmlStream) throws UnsupportedEncodingException {
return parse(getXmlEncodingReader(xmlStream));
}

/**
* 将 XML 字节流,按照指定字符集解析为 Map 集合数据。
* @param xmlStream 字节流
* @param encoding 字符集
* @return 集合数据
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
public static Map parse(InputStream xmlStream, String encoding) throws UnsupportedEncodingException {
HierarchicalStreamReader reader = driver.createReader(xmlStream, encoding);
return getData(reader);
}
/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param xmlReader 字符流
* @return 集合数据
*/
public static Map parse(Reader xmlReader) {
HierarchicalStreamReader reader = driver.createReader(xmlReader);
return getData(reader);
}

/**
* 获取字节流中 XML 内容指定的字符集编码,若 XML 中未指定编码,则返回 UTF-8。
* @param stream 字节流,必须支持 mark/reset 方法。
* @return 字符集
*/
public static String getEncoding(InputStream stream) {
String encoding = DEFAULT_ENCODING;
if (!stream.markSupported()) {
return encoding;
}
byte[] buf = new byte[70];
try {
stream.mark(100);
int len = stream.read(buf);
if (len  > 0) {
String xmlHead = new String(buf, 0, len);
Matcher m = encodingPattern.matcher(xmlHead);
if (m.find()) {
encoding = m.group(1).trim();
}
}
stream.reset();
} catch (Throwable e) {
log.error("get xml encoding error!", e);
}
return encoding;
}

/**
* 将 XML 字节流,转换为支持 XML 内容指定编码的字符流,若 XML 中未指定编码,则默认使用 UTF-8 进行编码解析。
* @param stream 字节流
* @return 字符流
* @throws UnsupportedEncodingException 不支持的字符集异常
*/
private static Reader getXmlEncodingReader(InputStream stream) throws UnsupportedEncodingException {
stream = new BufferedInputStream(stream);
return new InputStreamReader(stream, getEncoding(stream));
}

/**
* 将 XML 字符流,解析为 Map 集合数据。
* @param reader XML 字符流读取对象
* @return 集合数据
*/
private static Map getData(HierarchicalStreamReader reader) {
Map data = new HashMap();
fillData(reader, data, flat);
return data;
}

/**
* 设置解析完成后,填充Map集合时是否采用集合的方法。默认采用集合方法。
* 集合:既XML节点名称相同的数据使用ArrayList集合进行存储。
* 单一:既XML节点名称相同的数据只取第一个值进行存储。
* @param notList
*/
public static void setNotList(boolean no){
notList = no;
}

public static boolean isNotList(){
return notList;
}

/**
* 设置解析完成后,是否采取平板填充模式填充 Map 集合。若不采用平板填充模式,则 Map 集合采用与 XML 节点级别相同的结构存储数据。默认不采用。
* 平板填充模式:即不论是 XML 的哪级节点数据,均填充到根集合中,若根集合已存在该名称的节点数据,则此节点名称的数据采用 List 对象顺序存储。
* @param flatType 是否采取平板填充模式。
*/
public static void setFlatType(boolean flatType) {
flat = flatType;
}

/**
* 是否采取平板填充模式填充 Map 集合?
* @return 是否采取平板填充模式。
*/
public static boolean isFlatType() {
return flat;
}

/**
* 解析 XML 字符流,并将数据填充到指定 Map 集合中。
* @param reader XML 字符流读取对象
* @param data 待填充数据集合
* @param flatType 是否采用平板填充模式
*/
private static void fillData(HierarchicalStreamReader reader, Map data, boolean flatType) {
Map childs;

String name = reader.getNodeName();
Object value;
if (!reader.hasMoreChildren()) {
value = reader.getValue();
childs = null;
} else if (!flatType) {
value = childs = new HashMap();
} else {
value = "";
childs = data;
}
Object nodeContainer = data.get(name);
//name名称重复的直接覆盖
if(notList){
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
}
}else{
//重复的生成list保存
if (nodeContainer == null) {
if (value != null) {
data.put(name, value);
}
} else if (nodeContainer instanceof ArrayList) {
((ArrayList)nodeContainer).add(value);
} else {
ArrayList nodeList = new ArrayList();
nodeList.add(nodeContainer);
nodeList.add(value);
data.put(name, nodeList);
}
}
while (reader.hasMoreChildren()) {
reader.moveDown();
fillData(reader, childs, flatType);
reader.moveUp();
}
}

/**
* 自定义 XPP 解析驱动类
* @author wd
*/
private static class CustomXppDriver extends XppDriver {
    public CustomXppDriver() {
        super(new CustomReplacer());
    }
    public CustomXppDriver(XmlFriendlyReplacer replacer) {
        super(replacer);
    }
    /**
     * 将 XML 字节流,转换为支持指定字符集编码的 XML 字符流读取对象。
     * @param stream 字节流
     * @param encoding 字符集
     * @return XML 字符流读取对象
     * @throws UnsupportedEncodingException 不支持的字符集异常
     */
    public HierarchicalStreamReader createReader(InputStream stream, String encoding) throws UnsupportedEncodingException {
        return createReader(new InputStreamReader(stream, encoding));
    }
}

/**
* 自定义 XML 标签转换类
* @author wd
*/
private static class CustomReplacer extends XmlFriendlyReplacer {
public String escapeName(String name) {
return name;
}

public String unescapeName(String name) {
return name;
}
}

public static void main(String[] args) throws Exception {
java.io.ByteArrayOutputStream output = new java.io.ByteArrayOutputStream();
java.io.FileInputStream input = null;
byte[] data = new byte[1024];
int len = -1;
try {
input = new java.io.FileInputStream("c:\\test.txt");
for (;(len = input.read(data)) >= 0;) {
output.write(data, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
try {
input.close();
} catch (Exception e) {
}
}
}
byte[] xmlBytes = getMsg(output.toString());
System.out.println("xml 内容=" + new String(xmlBytes, getEncoding(new java.io.ByteArrayInputStream(xmlBytes))));
XmlParser.setFlatType(true);
Map xml = XmlParser.parse(xmlBytes);
System.out.println();
System.out.println("xml 对象=" + xml);
}
4
0
分享到:
评论
1 楼 mercyblitz 2010-06-27  
性能怎么,听说是Stream XML方式。

相关推荐

    xStream完整Jar包

    **XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的...通过深入学习和实践,我们可以充分利用 XStream 的优点,提高代码的可读性和可维护性。

    xstream学习文档及实例

    XStream 是一个强大的 Java 库,它允许程序员将 Java 对象序列化为 XML,反之...在阅读“xstream学习文档”时,建议重点理解其核心概念、使用示例以及自定义转换器的编写,以便在实际工作中游刃有余地应对各种需求。

    xstream教程资料.rar

    总结,XStream是一个强大且灵活的工具,适用于处理Java对象与XML之间的转换。无论是开发RESTful服务、数据持久化还是XML文档处理,XStream都能提供简洁、高效的解决方案。通过深入学习和实践,你将能熟练掌握这个...

    Xstream.Core 源代码 C#

    总结,Xstream.Core通过其精心设计的源代码,为C#开发者提供了一种强大而灵活的数据序列化工具。深入理解其工作原理并应用于实践,有助于提升项目开发效率和代码质量。通过对源代码的学习和实践,开发者可以更好地...

    XStream4JavaDemo演示源码

    总结来说,"XStream4JavaDemo演示源码"是学习和理解XStream库的一个宝贵资源。通过这个示例,我们可以了解到XStream如何简化Java对象与XML之间的转换,以及如何自定义转换规则以满足特定需求。无论是进行数据持久化...

    利用XStream读写xml文件

    通过本篇内容的学习,我们了解了XStream的基本原理以及如何使用它来读写XML文件。XStream不仅简化了XML与Java对象之间的转换过程,还提高了开发效率。在实际项目中,合理利用XStream可以有效地管理复杂的数据结构。

    xstream-1.3.1.jar

    总结起来,XStream 1.3.1是一个强大且易用的XML解析和序列化工具,为Java开发者提供了便捷的XML操作手段。虽然在某些方面可能存在局限,但通过合理的配置和使用,XStream可以有效地提升开发效率,降低XML处理的...

    xstream 的高级用法,自定义输出结构

    《XStream的高级用法与自定义输出结构详解》 XStream是一款强大的Java库,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。...更多关于XStream的详细信息,可以通过提供的博文链接深入学习。

    XStream简单应用实例

    **XStream简介** XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。它由Joe Walnes创建,旨在提供一种简洁、直观的方式...对于需要处理XML的Java开发人员来说,XStream是一个值得学习和使用的工具。

    XStream_1.3.chm 带 实例

    总结来说,“XStream_1.3.chm 带 实例”压缩包提供了一个学习和使用XStream的完整资源,包括详细的API文档和实践示例,对于想要掌握Java对象和XML之间转换的开发者来说,这是一个非常有价值的参考资料。

    xstream入门例子

    XStream 是一个强大的 Java 库,它允许程序员以一种简洁的 XML 格式来序列化和反序列化 Java 对象...这个入门例子是学习 XStream 的良好起点,进一步探索可以包括自定义转换逻辑、处理复杂对象结构以及优化性能等方面。

    应用源码之Xstream(解决xml和对象转换问题).zip

    在Android开发中,数据交换和持久化是常见任务,XML...结合源码学习,将有助于深入理解其内部机制,进一步提升你在XML处理方面的技能。在实际项目中,根据需求选择合适的序列化库,可以有效提高开发效率和代码质量。

    xstream-distribution-1.4.11.1-src_full_serializer_

    总结起来,XStream是一个功能强大、易用的Java序列化库,它的"full serializer"特性使得Java对象和XML之间的转换变得简单而直接。源码的开放为开发者提供了深入学习和定制的机会,增强了其在各种应用场景中的灵活性...

    ajax版无刷新显示最新新闻+javascript+Java+Servlet+XStream

    总结来说,这个项目涵盖了Web开发中的多个关键技术点,包括前端的Ajax通信、JavaScript交互,以及后端的Java Servlet处理和数据序列化。通过这样的设计,用户可以在浏览新闻时享受到无缝的加载体验,提高了网站的...

    Java转换xml.zip

    在IT领域,Java和XML(eXtensible Markup Language)是两种非常重要的技术。Java是一种广泛使用的编程语言,...通过学习和理解XStream,开发者可以更高效地在Java应用程序中处理XML数据,提升开发效率并简化数据操作。

    apache-camel-1.6.3.tar.gz

    总结起来,"apache-camel-1.6.3.tar.gz"是一个包含Apache Camel 1.6.3版本源码、文档和依赖的压缩包,适用于集成和路由任务,提供了丰富的组件和强大的路由规则定义能力,为开发人员构建企业级应用提供了有力的支持...

    SSH2 整合简单增删改查实例,仅供学习使用

    总结来说,这个SSH2整合的简单增删改查实例,旨在帮助初学者理解如何将Spring、Struts2和Hibernate协同工作,以及如何利用Gson和Ajax实现前后端的数据交互。通过对这些技术的实践,开发者能够更好地掌握Java Web开发...

    java代码导入导出Excel

    总结来说,这个压缩包提供了一个基于Apache POI的Java解决方案,用于方便地在程序中实现Excel的导入和导出。通过学习和使用提供的代码示例,开发者可以快速掌握如何在Java项目中处理Excel文件,无论是读取现有的数据...

    SocketIO-SocketIO-NettyClient&ServerMarshalingCode.zip

    通过阅读这些代码,我们可以学习到如何在Netty中集成SocketIO和Marshaling,理解其工作原理,并且可以作为模板来构建自己的实时通信系统。 总结来说,这个案例涉及到的关键技术点包括: 1. Netty框架:用于构建高...

    java将xml文件内容与ztree树形结构互转.zip

    总结来说,这个项目展示了如何利用Java的XML处理能力和JSON转换技巧,实现XML文件与ZTree树形结构之间的双向转换。对于熟悉Java和Web开发的程序员,这是一个很好的学习资源,有助于提升处理层次结构数据的能力。同时...

Global site tag (gtag.js) - Google Analytics