`
yuelong
  • 浏览: 33844 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

xml文件流与javabean之间的通用转换(上)

    博客分类:
  • Java
阅读更多

最近在做通讯方面的一些东西,移动端与服务器之间的通讯采用HttpUrlConnection以xml文件流的方式进行通讯。xml文件解析后,通常要给对应的数据模型(javabean)赋值,从而进行一些列的验证,入库,日志操作等。

 

1、通过HttpUrlConnection获取输入流,解码后生成xml文件字符串

2、使用dom4j解析此字符串生成Document对象

3、对Document对象递归遍历收集节点名称和节点值,并根据节点名称拼接set方法,用以和javabean反射后得到的set方法做匹配

 

具体代码如下:

 

1、模拟客户端发送xml数据流至服务器 Client.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.net.URLDecoder;

public class Client {
	
	private static final String POST = "http://localhost:8080/mobileCharge/charge/chargeAction!getMpay.action";
	
	public static void main(String[] args){
		sendXml();
	}
	
	public static String createXml() {
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<mpay>"
				+ "<methodName>getMpay</methodName>" + "<params>" + "<param>"
				+ "<type>1</type>" + "<terminalid>91300021</terminalid>"
				+ "<money>100.00</money>" + "<csn>02570001</csn>"
				+ "<password>1f3259007db02194cd134f18513dd00e</password>"
				+ "</param>" + "</params>" + "</mpay>";
		return xml;
	}
	
	
	public static void sendXml(){
		try {
			URL url = new URL(POST);
			//根据Url地址打开一个连接
			URLConnection urlConnection = url.openConnection();
			HttpURLConnection httpUrlConnection = (HttpURLConnection)urlConnection;
			//允许输出流
			httpUrlConnection.setDoOutput(true);
			//允许写入流
			httpUrlConnection.setDoInput(true);
			//post方式提交不可以使用缓存
			httpUrlConnection.setUseCaches(false);
			//请求类型
			httpUrlConnection.setRequestProperty("Content-Type", "text/html");
			httpUrlConnection.setRequestMethod("POST");
			//设置连接、读取超时
			httpUrlConnection.setConnectTimeout(30000);
			httpUrlConnection.setReadTimeout(30000);
			httpUrlConnection.connect();
			//使用缓冲流将xml字符串发送给服务器
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpUrlConnection.getOutputStream()));
			writer.write(URLEncoder.encode(createXml(),"UTF-8"));
			writer.flush();
			writer.close();
			writer = null;
			//关闭连接
			httpUrlConnection.disconnect();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

2、服务端获取到此输入流后转换为字符串,这个很简单,贴出主要代码即可

public String getXmlText(){
		//使用的是struts2 ,获取request很方便 O(∩_∩)O~
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
		String xmlText=null;
		try{
			//同样使用缓冲流
			BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String lines;
			while((lines = reader.readLine())!=null){
				sb.append(lines);
			}
			//客户端使用了UTF-8编码,这里使用同样使用UTF-8解码
			xmlText = URLDecoder.decode(sb.toString(),"UTF-8");
			reader.close();
			reader = null;
		}catch(Exception e){
			e.printStackTrace();
		}
		return xmlText;
		
	}

 

 一下就是xmlText与javabean之间的转换了,今天只写了上部分 xml - javabean  改天再写下部分 javabean - xml

 

3、xmlText -  javabean 的转换

 

/**
	 * 根据xml文件流对xmlModel赋值
	 * @param xmlText
	 * @param xmlModel
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static synchronized Object parseXml4Bean(String xmlText,Object xmlModel){
		try {
			//解析字符串生成docment对象
			Document xmlDoc = DocumentHelper.parseText(xmlText);
			//获取根节点
			Element element = xmlDoc.getRootElement();
			List<Map<String,String>> propsList = new ArrayList<Map<String,String>>();
			//解析xml中的节点名称和节点值,详细见下面parseXml
			propsList = parseXml(element, propsList);
			if(propsList.size()==0){
				return null;
			}
			//获取Method对象数组
			Method[] methods = xmlModel.getClass().getDeclaredMethods();
			for(int i=0;i<propsList.size();i++){
				for(int j=0;j<methods.length;j++){
					Method m = methods[j];
					if(propsList.get(i).containsKey(m.getName())){
						try {
							//执行set方法,将xml中的textNode值赋予Model中
							m.invoke(xmlModel, new Object[]{propsList.get(i).get(m.getName())});
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return xmlModel;
	}

 

 4、子方法 ,用以解析xml,拼接set方法匹配与Method数组

/**
	 * 获取xml文件中叶结点名称和节点值
	 * @param element
	 * @param propsList
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private static List<Map<String,String>> parseXml(Element element,List<Map<String,String>> propsList){
		if(element.isTextOnly()){
			HashMap<String,String> map = new HashMap<String,String>();
			String key = element.getName();
			key = METHOD_SET+key.substring(0,1).toUpperCase().concat(key.substring(1,key.length()));
			map.put(key,element.getTextTrim());
			propsList.add(map);
		}else{
			List<Element> tmpList = element.elements();
			for(Element e : tmpList){
				parseXml(e, propsList);
			}
		}
		return propsList;
	}

 

 

 5、java bean

package com.eptok.business.charge;

public class ChargeXmlModel {
	private String methodName;
	private String type;
	private String terminalid;
	private String money;
	private String csn;
	private String password;

	public String getMethodName() {
		return methodName;
	}

	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getTerminalid() {
		return terminalid;
	}

	public void setTerminalid(String terminalid) {
		this.terminalid = terminalid;
	}

	public String getMoney() {
		return money;
	}

	public void setMoney(String money) {
		this.money = money;
	}

	public String getCsn() {
		return csn;
	}

	public void setCsn(String csn) {
		this.csn = csn;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

 

6、测试调用   。。。。

 附件中有dom4j的jar ,可以下载

7
0
分享到:
评论
7 楼 zhuxinyu 2011-09-28  
我还想到了castor,也是非常给力的东西。
6 楼 yuelong 2011-09-26  
macrotea 写道
当看到这个标题的时候,我就想到jax

嗯。 要改!
5 楼 macrotea 2011-09-25  
当看到这个标题的时候,我就想到jax
4 楼 yuelong 2011-09-25  
myten 写道
新版本已经不繁琐了。我贴代码给你?
出错了的话给我留言



好的,有空我试一下
3 楼 myten 2011-09-23  
新版本已经不繁琐了。我贴代码给你?
package main;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import demo.model.Person;

public class Main {

	/**
	 * @param args
	 * @throws JAXBException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws JAXBException, FileNotFoundException {
		JAXBContext ctx=JAXBContext.newInstance(Person.class);
		toXML(ctx);
		fromXML(ctx);
		
	}
	public static void toXML(JAXBContext ctx) throws JAXBException, FileNotFoundException{
		Marshaller ms=ctx.createMarshaller();
		FileOutputStream fo=new FileOutputStream(new File("src/Person.xml"));
		Person p=new Person();
		//"Jack","12";
		p.age="ss";
		ms.marshal(p, fo);
	}
	public static void fromXML(JAXBContext ctx) throws FileNotFoundException, JAXBException{
		FileReader fo=new FileReader(new File("src/Person.xml"));
		Unmarshaller ums= ctx.createUnmarshaller();
		Person p=(Person) ums.unmarshal(fo);
		System.out.println(p.username);
	}

}



package demo.model;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
	
	public Person() {
		super();
	}
	public Person(String username, String age) {
		super();
		this.username = username;
		this.age = age;
	}
	@XmlAttribute
	public String username;
	public String age;
	
}


出错了的话给我留言
2 楼 yuelong 2011-09-23  
@myten
     刚才去了解了一下jaxb ,其使用确实很简单。 但对于xml文件格式要求比较繁琐,与xsd或dtd约束 。
     对于比较牛的服务端来说,可以采用。 像俺这公司,没办法要求对方发送格式化的xml报文,但在jaxb的一个帖子里面,了解了一下xstream,这个似乎可行。
    还是需要再改进一下的。 感谢你
1 楼 myten 2011-09-23  
楼主您辛苦了。如果您是要JavaBean和XMl互转传输,建议你看看JAXB,Java本身就已经支持了,没必要自己拼接字符串自己解析字符串

相关推荐

    javabean 与 xml文件转换

    JavaBean和XML之间的转换是Java开发中常见的数据交换方式,特别是在处理配置文件或者进行数据持久化时。这两种格式都有其独特的优势:JavaBean是面向对象的,方便编程,而XML则是一种通用的数据交换格式,易于人阅读...

    javaBean 与 xml 互转

    通过定义符合JavaBean规范的类,并利用JAXB的序列化和反序列化功能,我们可以方便地在Java对象和XML文档之间进行数据转换。这在处理Web服务、配置文件或跨平台数据交换时非常有用。在实际开发中,确保对这些基本概念...

    java对象与xml间的转换.docx

    Java 对象与 XML 之间的转换 Java 对象与 XML 之间的转换是 Java programming 中的一个重要话题。随着软件开发的复杂化,数据交换变得越来越频繁,而 XML 作为一种通用的数据交换格式,渐渐成为开发者们的选择之一...

    Jaxb2 实现JavaBean与xml互转

    当需要在Java程序中处理XML数据时,JAXB(Java Architecture for XML Binding)提供了一种方便、高效的方法,将Java对象和XML文档之间进行映射,实现了JavaBean与XML之间的自动转换。本篇将深入探讨JAXB2在实现...

    java 根据javaBean反射自定义导出 excel、xml、pdf、csv

    首先,为JavaBean创建一个对应的XML Schema(XSD),然后使用JAXB将JavaBean对象转换成XML文档。 3. **PDF**:生成PDF文件可以使用iText库。创建一个`Document`对象,然后添加`Paragraph`、`Table`等元素,将...

    java持久化工具类:JavaBean与XML

    JavaBean是一种符合特定规范的Java类,常用于封装业务逻辑和数据,而XML则是一种通用的数据交换格式,常用于配置文件和数据传输。 ### JavaBean JavaBean是一种遵循特定规则的Java类,它主要用于封装数据和提供可...

    xmlbean轻轻松松读写XML的利器

    **XMLBean**是一款类似于Hibernate这样的对象关系映射(Object Relational Mapping,ORM)工具的产品,它将复杂的XML读写操作简化为对JavaBean的操作,从而极大地简化了XML的读写过程,使得即使是不熟悉XML的开发者...

    读取文件数据并解析成bean实体类

    4. **对象映射(对象-XML/JSON映射)**:这是一种将数据结构(如Bean)与数据格式(如XML或JSON)之间进行转换的技术。比如,使用Jackson库的`ObjectMapper`可以方便地将JSON字符串解析成Bean,反之亦然。 5. **...

    XML_与_Java_技术_用_Castor_进行数据绑定.doc

    总之,Castor框架是Java开发者处理XML数据的一个强大工具,它通过数据绑定简化了XML与Java对象之间的转换,减少了编程复杂性,提高了效率。对于那些主要关心XML数据内容而非其结构的项目,采用Castor进行数据绑定是...

    JSP+XML构架网站的实例

    总的来说,JSP+XML架构网站的实例展示了如何利用XML进行数据标准化,动态生成XML文档,并通过XSL进行数据转换,以实现灵活且高效的网页呈现。这种技术组合在处理复杂数据和构建可扩展的Web应用程序时具有显著优势。

    jsp+javabean+servlet 权限管理系统

    总的来说,"jsp+javabean+servlet 权限管理系统"是一个基于Java Web技术的权限控制解决方案,它涵盖了用户认证、授权的基本流程,以及与数据库交互、视图展示和业务逻辑处理的关键环节。通过学习和理解这个系统,...

    JAVA\JSP and XML

    在Java Web应用程序中,JSP主要用于创建动态网页,而XML则是一种通用的数据交换格式,常用于存储和传输结构化数据。 **Java JSP技术** 1. **JSP概述**:JSP是Java平台上的服务器端脚本语言,它允许开发者在HTML...

    IOUtils jar

    其设计原则是使得操作更加简洁,避免资源泄露,并提供了一些实用的功能,如字符串与流之间的转换、文件的读写等。 1. **流的复制与粘贴**: IOUtils的`copy()`方法非常实用,它可以将一个输入流的数据复制到另一个...

    java传智播客

    UI层负责用户交互,DAO层用于数据库或文件的读写,JavaBean封装业务对象,工具类(Util)则包含静态方法,提供通用的功能,如日期转换、字符串处理等。 5. **异常处理**: Java中的异常分为两种类型:编译时异常...

    ibatis基础教程

    此外,还需要定义映射文件,用于描述Java对象与数据库表之间的映射关系。 #### 七、DTD的作用与意义 DTD(Document Type Definition)是XML文档类型定义的一种标准,它用于描述XML文档的结构。在iBatis中,DTD文件...

    mybatis反转引擎generator

    配置文件允许用户定义生成的类的命名规则、字段名的转换策略、是否生成通用的CRUD方法等。 3. **Java实体类** MBG根据数据库中的表生成对应的Java实体类。每个实体类代表一个数据库表,包含表中的所有字段,且每个...

    基于Java的两个通用安全模块的设计与实现.zip

    JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

    json-lib-jar包

    在这个场景中,它可能被JSON-lib用来辅助处理Java集合与JSON之间的转换。 3. xom-1.2.4.jar:XOM(XML Object Model)是一个用于处理XML的Java库,它提供了一个简洁且一致的API来操作XML文档。虽然JSON-lib主要处理...

    SpringIOC所需要的jar包

    4. **jaxen-1.1-beta-6.jar**:Jaxen是一个通用的XPath库,可以在各种XML API(如DOM、JDOM、XOM等)之间提供统一的XPath实现。Spring框架在进行基于XPath的XML配置文件解析时,可能会利用到Jaxen。 5. **commons-...

Global site tag (gtag.js) - Google Analytics