`
conkeyn
  • 浏览: 1529033 次
  • 性别: 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

分享到:
评论

相关推荐

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    对于Map集合,XStream会使用键作为XML标签,值作为内容: ```java Map, String&gt; map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); String xmlMap = xstream.toXML(map); ``` ...

    xstream轻松解析xml到java对象

    在IT行业中,XML(eXtensible Markup ...它不仅简化了开发流程,还提供了丰富的定制选项,使得XML处理更加灵活和安全。在实际项目中,尤其是涉及到XML数据交换和持久化存储时,XStream是一个非常值得考虑的工具。

    xstream对象与xml转换

    在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。...无论你是新手还是经验丰富的开发者,了解并掌握XStream都会对你的Java开发工作带来极大的便利。

    xml解析及使用XStream实现javaBean与xml之间的转换

    本篇将详细讲解XML的解析方式及其在Java中的应用,特别是如何使用XStream库进行JavaBean与XML之间的互转。 1. **XML解析方式** - DOM解析:Document Object Model,它一次性加载整个XML文档到内存,形成一棵树形...

    Xstream生产xml和解析xml

    ### Xstream:Java与XML之间的桥梁 Xstream是一款强大的Java库,用于实现Java对象与XML文档之间的转换。...通过这些配置,XStream能够智能地处理类及其属性的XML映射,极大地简化了序列化和反序列化的开发工作。

    转载 xStream完美转换XML、JSON

    标题 "xStream完美转换XML、JSON" 指的是使用xStream库在Java中进行XML与JSON数据格式之间的转换。xStream是一个强大的库,它提供了一种简单的方式来序列化和反序列化Java对象到XML,反之亦然。在这个场景中,它同样...

    XStream解析XML实例

    在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作。 **1. XStream简介** ...

    xStream xml to bean

    在Java开发中,数据转换是常见的任务之一,特别是在处理XML数据时。xStream是一个轻量级的库,它提供了一种简单的方式来将Java对象序列化为XML,反之亦然。这个工具类的目标就是利用xStream的功能,方便地将XML文档...

    XStream XML解析

    **XStream XML解析** XStream 是一个开源的 Java 库,它提供了一种简单而有效的方式来将 Java 对象序列化为 XML 和从 XML 反序列化回 Java 对象...理解和掌握 XStream 的使用,可以极大地提升开发效率并简化代码维护。

    xstream+xmlpull xml to bean &&bean to xml

    这个过程使得XML和Java对象之间可以方便地进行双向转换,极大地提升了开发效率和代码的可读性。 在XStream中,你可以定义一个Java类,然后通过XStream实例将其实例化后的对象转换成XML字符串。同样,也可以从XML...

    使用XStream 多集合生成xml

    在Java开发中,数据序列化和反序列化是常见的需求,特别是在处理XML格式的数据时。XStream是一个强大的库,它提供了将Java对象转换为XML,以及将XML转换回等效Java对象的功能。在这个场景中,"使用XStream多集合生成...

    利用XStream读写xml文件

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

    xStream转换xml和json源码

    总的来说,xStream是Java开发中处理XML和JSON的强大工具,它提供了简单易用的API来实现对象与这两种数据格式之间的转换。通过理解和掌握xStream的使用,开发者可以更高效地处理数据序列化和反序列化任务。

    XStream在JavaBean与XML/JSON 之间相互转换

    **XStream:JavaBean与XML/JSON之间的转换大师** XStream是一个开源库,它为Java对象提供了简单且直观的XML序列化和反序列化的解决方案。...通过熟练掌握XStream,开发人员可以更高效地处理数据交换和持久化任务。

    Xstream生成和解析xml.rar

    在Java开发中,XML(Extensible Markup Language)作为一种标准的数据交换格式,被广泛应用于系统间的数据传输和存储。...在实际开发中,熟练掌握Xstream的使用,将有助于提升XML操作的效率和代码的可读性。

    使用XStream是实现XML与Java对象的转换(6)--持久化

    5. **从文件加载**:从磁盘读取XML并反序列化回对象,我们需要先读取文件内容,然后调用`fromXML()`。例如,`MyObject myObject = (MyObject) xstream.fromXML(new FileReader("output.xml"))`将从“output.xml”...

    使用XStream是实现XML与Java对象的转换(5)--Object Stream

    在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为可以存储或传输的形式,然后再恢复。XStream是一个强大的库,它使得XML与Java对象之间的转换变得简单。在这个主题中,我们将深入...

    xstream解析xml

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,广泛应用在各种系统间的数据...实际应用中,开发者可以根据这些知识对XML数据进行读取、解析和存储,提升开发效率和代码可读性。

    XStream解析xml 转换成对象案例

    而XStream是一个Java库,它能够将Java对象序列化为XML,反之也能将XML反序列化回Java对象,极大地简化了Java与XML之间的交互。本篇文章将深入探讨如何使用XStream进行XML到对象的转换,并提供一个实际的案例。 首先...

    xstream将xml文档转换成json对象

    XStream是一个强大的Java库,它允许我们方便地将Java对象序列化为XML,反之亦然。在这个场景中,我们将探讨如何使用XStream将XML文档转换成Java对象,进而转化为JSON对象。 首先,我们需要引入XStream库。XStream的...

Global site tag (gtag.js) - Google Analytics