1、编写自定义XPPDriver代码:
package com.c.common; import java.io.Writer; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.XppDriver; public class MyXppDriver extends XppDriver { public HierarchicalStreamWriter createWriter(Writer out) { return new MyPrettyPrintWriter(out); } }
2、编写自定义格式化器,可以使XML中的特殊字符被<cdata>包含起来。
package com.mport.xstream; import java.io.PrintWriter; import java.io.Writer; import com.thoughtworks.xstream.core.util.FastStack; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class MyPrettyPrintWriter implements HierarchicalStreamWriter { private final QuickWriter writer; private final FastStack elementStack = new FastStack(16); private final char[] lineIndenter; private boolean tagInProgress; private int depth; private boolean readyForNewLine; private boolean tagIsEmpty; private static final char[] AMP = "&".toCharArray(); private static final char[] LT = "<".toCharArray(); private static final char[] GT = ">".toCharArray(); private static final char[] SLASH_R = " ".toCharArray(); private static final char[] QUOT = """.toCharArray(); private static final char[] APOS = "'".toCharArray(); private static final char[] CLOSE = "</".toCharArray(); public MyPrettyPrintWriter(Writer writer, char[] lineIndenter) { this.writer = new QuickWriter(writer); this.lineIndenter = lineIndenter; } public MyPrettyPrintWriter(Writer writer, String lineIndenter) { this(writer, lineIndenter.toCharArray()); } public MyPrettyPrintWriter(PrintWriter writer) { this(writer, new char[]{' ', ' '}); } public MyPrettyPrintWriter(Writer writer) { this(new PrintWriter(writer)); } public void startNode(String name) { tagIsEmpty = false; finishTag(); writer.write('<'); writer.write(name); elementStack.push(name); tagInProgress = true; depth++; readyForNewLine = true; tagIsEmpty = true; } public void setValue(String text) { readyForNewLine = false; tagIsEmpty = false; finishTag(); writeText(writer, text); } public void addAttribute(String key, String value) { writer.write(' '); writer.write(key); writer.write('='); writer.write('"'); writeAttributeValue(writer, value); writer.write('"'); } protected void writeAttributeValue(QuickWriter writer, String text) { int length = text.length(); for (int i = 0; i < length; i++) { char c = text.charAt(i); switch (c) { case '&': this.writer.write(AMP); break; case '<': this.writer.write(LT); break; case '>': this.writer.write(GT); break; case '"': this.writer.write(QUOT); break; case '\'': this.writer.write(APOS); break; case '\r': this.writer.write(SLASH_R); break; default: this.writer.write(c); } } } protected void writeText(QuickWriter writer, String text) { int length = text.length(); String CDATAPrefix = "<![CDATA["; String CDATASuffix = "]]>"; if (!text.startsWith(CDATAPrefix)){ boolean needCDATA=false; for (int i = 0;i < length;i++) { char c = text.charAt(i); if(c=='&'||c=='<'||c=='>'||c=='\''||c=='\r'){ needCDATA=true; break; } } if(needCDATA){ text=CDATAPrefix+text+CDATASuffix; } } this.writer.write(text); // for (int i = 0; i < length; i++) { // char c = text.charAt(i); // this.writer.write(c); // } // if (!text.startsWith(CDATAPrefix)) { // for (int i = 0; i < length; i++) { // char c = text.charAt(i); // switch (c) { // case '&': // this.writer.write(AMP); // break; // case '<': // this.writer.write(LT); // break; // case '>': // this.writer.write(GT); // break; // case '"': // this.writer.write(QUOT); // break; // case '\'': // this.writer.write(APOS); // break; // case '\r': // this.writer.write(SLASH_R); // break; // default: // this.writer.write(c); // } // } // } // // else { // for (int i = 0; i < length; i++) { // char c = text.charAt(i); // this.writer.write(c); // } // } } public void endNode() { depth--; if (tagIsEmpty) { writer.write('/'); readyForNewLine = false; finishTag(); elementStack.popSilently(); } else { finishTag(); writer.write(CLOSE); writer.write((String)elementStack.pop()); writer.write('>'); } readyForNewLine = true; if (depth == 0 ) { writer.flush(); } } private void finishTag() { if (tagInProgress) { writer.write('>'); } tagInProgress = false; if (readyForNewLine) { endOfLine(); } readyForNewLine = false; tagIsEmpty = false; } protected void endOfLine() { writer.write('\n'); for (int i = 0; i < depth; i++) { writer.write(lineIndenter); } } public void flush() { writer.flush(); } public void close() { writer.close(); } public HierarchicalStreamWriter underlyingWriter() { return this; } }
3、编写XML提交内容器
package com.c.common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import org.apache.commons.logging.Log; import com.mport.xstream.MyXppDriver; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.mapper.MapperWrapper; /** * * @author lzq * */ public final class HttpPostXmlUtil { private static XStream xStream = null; static { if (xStream == null) { xStream = new XStream(new MyXppDriver())// ; { @Override // 告诉Xstream忽略在转换XML文档到java对象过程中XML文档多出的元素 protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override public boolean shouldSerializeMember(Class definedIn, String fieldName) { if (definedIn == Object.class) { try { return this.realClass(fieldName) != null; } catch (Exception e) { return false; } } else { return super.shouldSerializeMember(definedIn, fieldName); } } }; } }; xStream.setMode(XStream.NO_REFERENCES); } } /** * 将对象转换为XML文本 * * @param obj * @return */ public static String obj2xml(Class[] types, Object obj) { xStream.processAnnotations(types); return xStream.toXML(obj); } /** * 将XML文本转换对象 * * @param xml * @return */ public static Object xml2obj(Class[] types, String xml) { xStream.processAnnotations(types); return xStream.fromXML(xml); } /** * * @param url * @param request * @param log * 日志记录对象 * @return 返回响应 */ public static String postXmlText(String url, String xmlReq, Integer timeOut, Log log) { String response = null; try { timeOut = (timeOut == null || timeOut < 1) ? 5 * 1000 : timeOut; byte[] bb = xmlReq.getBytes("UTF-8"); // 请求地址 URL targetUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(timeOut);// 设置超时的时间 conn.setDoInput(true); conn.setDoOutput(true);// 如果通过post提交数据,必须设置允许对外输出数据 conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");// 必须定义为text/xml内容类型,如果定义为application/x-www-form-urlencoded、multi/form-data conn.setRequestProperty("Content-Length", String.valueOf(bb.length)); conn.connect(); OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.write(xmlReq); // 写入请求的字符串 out.flush(); out.close(); // 请求返回的状态 if (conn.getResponseCode() == 200) { // 请求返回的数据 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); try { StringBuffer data = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { data.append(line + '\n'); } // 转成字符串 response = data.toString(); } catch (Exception e1) { e1.printStackTrace(); } finally { br.close(); } } else { log.error("Response Code: " + conn.getResponseCode()); } } catch (IOException e) { e.printStackTrace(); } return response; } }
d
相关推荐
对于Map集合,XStream会使用键作为XML标签,值作为内容: ```java Map, String> map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); String xmlMap = xstream.toXML(map); ``` ...
在IT行业中,XML(eXtensible Markup ...它不仅简化了开发流程,还提供了丰富的定制选项,使得XML处理更加灵活和安全。在实际项目中,尤其是涉及到XML数据交换和持久化存储时,XStream是一个非常值得考虑的工具。
在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。...无论你是新手还是经验丰富的开发者,了解并掌握XStream都会对你的Java开发工作带来极大的便利。
本篇将详细讲解XML的解析方式及其在Java中的应用,特别是如何使用XStream库进行JavaBean与XML之间的互转。 1. **XML解析方式** - DOM解析:Document Object Model,它一次性加载整个XML文档到内存,形成一棵树形...
### Xstream:Java与XML之间的桥梁 Xstream是一款强大的Java库,用于实现Java对象与XML文档之间的转换。...通过这些配置,XStream能够智能地处理类及其属性的XML映射,极大地简化了序列化和反序列化的开发工作。
标题 "xStream完美转换XML、JSON" 指的是使用xStream库在Java中进行XML与JSON数据格式之间的转换。xStream是一个强大的库,它提供了一种简单的方式来序列化和反序列化Java对象到XML,反之亦然。在这个场景中,它同样...
在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作。 **1. XStream简介** ...
在Java开发中,数据转换是常见的任务之一,特别是在处理XML数据时。xStream是一个轻量级的库,它提供了一种简单的方式来将Java对象序列化为XML,反之亦然。这个工具类的目标就是利用xStream的功能,方便地将XML文档...
**XStream XML解析** XStream 是一个开源的 Java 库,它提供了一种简单而有效的方式来将 Java 对象序列化为 XML 和从 XML 反序列化回 Java 对象...理解和掌握 XStream 的使用,可以极大地提升开发效率并简化代码维护。
这个过程使得XML和Java对象之间可以方便地进行双向转换,极大地提升了开发效率和代码的可读性。 在XStream中,你可以定义一个Java类,然后通过XStream实例将其实例化后的对象转换成XML字符串。同样,也可以从XML...
在Java开发中,数据序列化和反序列化是常见的需求,特别是在处理XML格式的数据时。XStream是一个强大的库,它提供了将Java对象转换为XML,以及将XML转换回等效Java对象的功能。在这个场景中,"使用XStream多集合生成...
通过本篇内容的学习,我们了解了XStream的基本原理以及如何使用它来读写XML文件。XStream不仅简化了XML与Java对象之间的转换过程,还提高了开发效率。在实际项目中,合理利用XStream可以有效地管理复杂的数据结构。
总的来说,xStream是Java开发中处理XML和JSON的强大工具,它提供了简单易用的API来实现对象与这两种数据格式之间的转换。通过理解和掌握xStream的使用,开发者可以更高效地处理数据序列化和反序列化任务。
**XStream:JavaBean与XML/JSON之间的转换大师** XStream是一个开源库,它为Java对象提供了简单且直观的XML序列化和反序列化的解决方案。...通过熟练掌握XStream,开发人员可以更高效地处理数据交换和持久化任务。
在Java开发中,XML(Extensible Markup Language)作为一种标准的数据交换格式,被广泛应用于系统间的数据传输和存储。...在实际开发中,熟练掌握Xstream的使用,将有助于提升XML操作的效率和代码的可读性。
5. **从文件加载**:从磁盘读取XML并反序列化回对象,我们需要先读取文件内容,然后调用`fromXML()`。例如,`MyObject myObject = (MyObject) xstream.fromXML(new FileReader("output.xml"))`将从“output.xml”...
在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为可以存储或传输的形式,然后再恢复。XStream是一个强大的库,它使得XML与Java对象之间的转换变得简单。在这个主题中,我们将深入...
在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,广泛应用在各种系统间的数据...实际应用中,开发者可以根据这些知识对XML数据进行读取、解析和存储,提升开发效率和代码可读性。
而XStream是一个Java库,它能够将Java对象序列化为XML,反之也能将XML反序列化回Java对象,极大地简化了Java与XML之间的交互。本篇文章将深入探讨如何使用XStream进行XML到对象的转换,并提供一个实际的案例。 首先...
XStream是一个强大的Java库,它允许我们方便地将Java对象序列化为XML,反之亦然。在这个场景中,我们将探讨如何使用XStream将XML文档转换成Java对象,进而转化为JSON对象。 首先,我们需要引入XStream库。XStream的...