`
conkeyn
  • 浏览: 1511701 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

xStream开发HTTP的XML内容

 
阅读更多

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 = "&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 = "&quot;".toCharArray();
    private static final char[] APOS = "&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

分享到:
评论

相关推荐

    XStream和Xpp3实现对象到XML的互转参考文档

    在Java开发中,有时我们需要将Java对象转换为XML格式的数据,以便于存储或传输。XStream和Xpp3是两个常用的库,用于实现Java对象与XML之间的转换。本文档将详细介绍如何使用XStream和Xpp3进行对象到XML的转换,并...

    XStream开发使用的包

    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 二: 把对象转换成xml

    android XMl 解析神奇xstream 二: 把对象转换成xm

    xStream 开发指南

    这意味着开发人员可以使用 xStream 在 Java 对象和这两种常见的数据交换格式之间自由切换,而无需担心丢失信息或格式不兼容的问题。 xStream 提供了注解功能,通过在 JavaBean 中使用这些注解,可以自定义 XML 节点...

    XML开发包xstream.zip

    最简便,最好用的XML工具包xstream

    xstream和betwixt对xml、object的互转

    用xstream和betwixt实现对xml、object的互相转换。直接下载到本地后导入到eclipse里可以运行。 适合初学者和项目开发的同学们。

    XStream对象序列化

    在使用XStream时,首先需要设置开发环境。这包括安装Eclipse IDE、下载XStream库并将其添加到Java项目中作为外部JAR,以及确保Java SDK已经安装。在Eclipse中,可以通过“File &gt; New &gt; Project”创建一个新的Java...

    详解XML,Object,Json转换与Xstream的使用

    【XML,Object,Json转换与Xstream的使用详解】 XML,Object,Json转换在软件开发中扮演着重要的角色,尤其是在数据交换和存储方面。Xstream是一个强大的Java库,它简化了对象与XML之间的序列化和反序列化过程。...

    android 使用XStream解析xml的实例

    android 使用XStream解析xml的实例 android平台上,解析xml文件是一种非常常见的操作。XStream是一个高性能的XML解析库,它可以将xml文件转换成Java...通过使用XStream,我们可以方便地进行数据处理,提高了开发效率。

    xstream-1.3.1.jar.zip

    xstream开发所需包,有license,提供xml转换object和object转换xml

    Xstream的工具类

    Xstream开发过程中其中内部存在一个类会在new的时候新建出来,但是无法回收,则设置Xstream为单例的

    xstream142和xpp3.zip

    xstream-1.4.2.jar和xpp3_min-1.1.4c.jar包下载,用于JAVA解析xml,欢迎你的使用,以提升你的开发效率

    基于Java的Struts2 XStream插件设计源码

    Struts2 XStream插件:基于Java开发,包含20个文件,包括12个Java类文件、2个XML配置文件、1个.gitignore文件、1个Properties配置文件、1个LICENSE文件、1个Markdown文档、1个Maven命令文件(mvnw)和1个命令文件...

    xstream反序列化流程分析1

    在本文中,我们将深入探讨XStream库的反序列化流程,这是一个流行的Java库,用于将XML数据转换为Java对象和反之亦然。XStream的反序列化过程涉及到多个步骤,从接收XML字符串到最终创建Java对象。以下是详细的分析:...

    xstream-1.3.1.zip

    javabean与xml之间的转化, xml解析拼接, 开发必备。

    Bboss和xstream序列化反序列化性能对比1

    这两个库在Java开发中广泛用于将对象转换为XML格式,以便于存储、传输或持久化。以下是对这两个库的详细分析。 首先,Bboss和Xstream都提供了简单易用的API来实现序列化和反序列化。在测试中,我们观察了它们对特定...

    使用java对xml进行操作

    在实际项目中,Java还提供了许多库来简化XML操作,如JDOM、DOM4J和XStream。这些库提供了更高级别的抽象,使代码更简洁,同时通常也更高效。学习和理解如何在Java中操作XML是软件开发中重要的技能之一,特别是在处理...

    基于Java的XML解析与反射设计模式.doc

    xstream可以完美转换xml,与以往的解析xml工具dom相比,xstream是一个易用的、开源 的库,使用起来简单、小巧,容易理解,可以轻易的将java对象和xml文档相互转换,而 且可以修改某个特定的属性和节点名称。...

    基于Java的XML解析与反射设计模式.pdf

    由于与Java对象的完美转换,XStream更加贴近于面向对象的设计思想,让开发人员更易于使用,更易于过度解析XML与项目业务逻辑之间的联系。 在Java中,反射设计模式是一个非常重要的概念。反射设计模式可以让Java程序...

    Android开发连接服务器调用数据库

    在服务器端,使用了 XStream 库来将 XML 字符串转换回 HashMap。 知识点五:Android 客户端调用服务器 在 Android 客户端中,需要使用 HttpURL 库来调用服务器端的 Servlet。在这个例子中,使用了 HttpURL 库来...

Global site tag (gtag.js) - Google Analytics