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
相关推荐
在Java开发中,有时我们需要将Java对象转换为XML格式的数据,以便于存储或传输。XStream和Xpp3是两个常用的库,用于实现Java对象与XML之间的转换。本文档将详细介绍如何使用XStream和Xpp3进行对象到XML的转换,并...
XStream开发时使用的包,官网原句:XStream is a simple library to serialize objects to XML and back again. 要使对象转化成xml,使用: XStream xstream = new XStream(); String str = xtream.toXML(Object); ...
android XMl 解析神奇xstream 二: 把对象转换成xm
这意味着开发人员可以使用 xStream 在 Java 对象和这两种常见的数据交换格式之间自由切换,而无需担心丢失信息或格式不兼容的问题。 xStream 提供了注解功能,通过在 JavaBean 中使用这些注解,可以自定义 XML 节点...
最简便,最好用的XML工具包xstream
用xstream和betwixt实现对xml、object的互相转换。直接下载到本地后导入到eclipse里可以运行。 适合初学者和项目开发的同学们。
在使用XStream时,首先需要设置开发环境。这包括安装Eclipse IDE、下载XStream库并将其添加到Java项目中作为外部JAR,以及确保Java SDK已经安装。在Eclipse中,可以通过“File > New > Project”创建一个新的Java...
【XML,Object,Json转换与Xstream的使用详解】 XML,Object,Json转换在软件开发中扮演着重要的角色,尤其是在数据交换和存储方面。Xstream是一个强大的Java库,它简化了对象与XML之间的序列化和反序列化过程。...
android 使用XStream解析xml的实例 android平台上,解析xml文件是一种非常常见的操作。XStream是一个高性能的XML解析库,它可以将xml文件转换成Java...通过使用XStream,我们可以方便地进行数据处理,提高了开发效率。
xstream开发所需包,有license,提供xml转换object和object转换xml
Xstream开发过程中其中内部存在一个类会在new的时候新建出来,但是无法回收,则设置Xstream为单例的
xstream-1.4.2.jar和xpp3_min-1.1.4c.jar包下载,用于JAVA解析xml,欢迎你的使用,以提升你的开发效率
Struts2 XStream插件:基于Java开发,包含20个文件,包括12个Java类文件、2个XML配置文件、1个.gitignore文件、1个Properties配置文件、1个LICENSE文件、1个Markdown文档、1个Maven命令文件(mvnw)和1个命令文件...
在本文中,我们将深入探讨XStream库的反序列化流程,这是一个流行的Java库,用于将XML数据转换为Java对象和反之亦然。XStream的反序列化过程涉及到多个步骤,从接收XML字符串到最终创建Java对象。以下是详细的分析:...
javabean与xml之间的转化, xml解析拼接, 开发必备。
这两个库在Java开发中广泛用于将对象转换为XML格式,以便于存储、传输或持久化。以下是对这两个库的详细分析。 首先,Bboss和Xstream都提供了简单易用的API来实现序列化和反序列化。在测试中,我们观察了它们对特定...
在实际项目中,Java还提供了许多库来简化XML操作,如JDOM、DOM4J和XStream。这些库提供了更高级别的抽象,使代码更简洁,同时通常也更高效。学习和理解如何在Java中操作XML是软件开发中重要的技能之一,特别是在处理...
xstream可以完美转换xml,与以往的解析xml工具dom相比,xstream是一个易用的、开源 的库,使用起来简单、小巧,容易理解,可以轻易的将java对象和xml文档相互转换,而 且可以修改某个特定的属性和节点名称。...
由于与Java对象的完美转换,XStream更加贴近于面向对象的设计思想,让开发人员更易于使用,更易于过度解析XML与项目业务逻辑之间的联系。 在Java中,反射设计模式是一个非常重要的概念。反射设计模式可以让Java程序...
在服务器端,使用了 XStream 库来将 XML 字符串转换回 HashMap。 知识点五:Android 客户端调用服务器 在 Android 客户端中,需要使用 HttpURL 库来调用服务器端的 Servlet。在这个例子中,使用了 HttpURL 库来...