这几天在做微信公众号
做的过程中想找个java bean转xml的工具,找了几个用着不知道是配置不好还是怎么回事,都会有一些问题,
然后脑子一热谢了一个javabean和xml的转换的工具里,自己用着还行,虽然有一些约束吧 ,
还是贴出来记录一下
顺便你提一下下,这个转换工具支持属性为集合、数组和非基本属性的对象。
package com.uke.util; import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.xml.sax.InputSource; import com.uke.bean.Message; import com.uke.bean.remsg.Music; import com.uke.bean.remsg.ReMusicMsg; /** * * @author q821424508@sina.com * */ public class BeanUtil { /** * 对象转为xml字符串 * @param obj * 需要转xml的对象 * @param root * xml跟标签的名称,默认为xml * @return * 返回转换后的xml * <br> * 说明: * <br> * 目前来说这个方法能够把对象转换成xml字符串没有什么问题,但是对bean类有一定的要求: * <br> * 1.<strong>bean类的没有需要设置的属性必须有getter、setter方法</strong> * 2.<strong>生成的xml不会设置到xml的属性</strong> * @throws InstantiationException * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException * @throws JDOMException * @throws IOException * @throws ParserConfigurationException */ public static String convertToXml(Object obj,String root) throws InstantiationException { //加这一句判断是为了方便递归调用,如果root为空,那么视为第一次调用,也就是xml的根 if(StrUtil.isNullOrEmptyOrBlank(root)){ root = "xml"; } if(root.equalsIgnoreCase("item")){ ////、!!为什么只有这个以的item的i是小写的,其他的标签都是第一个字符大写的。why root = root.toLowerCase(); } try { //声明一个列表 存放需要转换成xml类的所有设计的父类 //这个地方没有涉及到属性为类的地方,应为下面的处理方法是,如果属性是类的话,就递归调用这个方法,所以没有什么需要担心的 List<Class<?>> cl = new ArrayList<Class<?>>(); //获取对象的类 Class<?> clazz = obj.getClass(); //判断,如果父类不是Object的话把所有的类放到上面声明的list里面 String simpleName = clazz.getSimpleName(); while (!"Object".equals(simpleName)) { cl.add(clazz); clazz = clazz.getSuperclass(); simpleName = clazz.getSimpleName(); } //上面是从子类开始存放的,所以这里要反转 Collections.reverse(cl); //开始创建xml StringBuffer xml = new StringBuffer("<"+root+">\n"); for (Class<?> cz : cl) { //System.out.println("list " + cz.getName()); //获取类里面声明的所有属性,之所以上面要获取父级的类,时应为这里只能获取当前类的声明方法,无法获取到集成来的方法 Field[] fs = cz.getDeclaredFields(); for (Field f : fs) { // System.out.println("f.getName() = "+f.getName()); // System.out.println("f.getName() = "+f.getType().getName()); // //获取属性的类型 Class<?> ct =f.getType(); //获取类对应的名称 String ctName = ct.getSimpleName(); String fName = f.getName(); String firstUpperName = fName.substring(0, 1).toUpperCase()+fName.substring(1); //System.out.println(); //当然,如果类是基础类型的直接设值就可以了 if("int".equals(ctName) || "long".equals(ctName)|| "double".equals(ctName)|| "float".equals(ctName) || "char".equals(ctName)){ xml.append(getFieldXml(f,cz,obj)).append("\n"); }else if("String".equals(ctName)||"char".equals(ctName)){ xml.append(getFieldXml(f,cz,obj)).append("\n"); }else { //如果属性不是基础类型的,则需要递归调用,也就是把上面的方法冲走一遍 //通过执行get方法,获取对象的返回值。 String methodName = "get" +firstUpperName; Class<?>[] cnull = null; Method m=cz.getMethod(methodName, cnull); Object[] osnull =null; Object reto=m.invoke(obj, osnull); if(null!=reto){ if(reto instanceof Collection<?>){ //如果结果是集合类型,那么获取子元素继续 xml.append("<"+firstUpperName+">\n"); Collection<Object> ol = (Collection<Object>)reto; for(Object o:ol){ xml.append(convertToXml(o,o.getClass().getSimpleName())); } xml.append("</"+firstUpperName+">\n"); }else if(reto instanceof Array){ //如果结果是数组类型,那么获取数组里每个元素继续 xml.append("<"+firstUpperName+">\n"); Object[] ol = (Object[])reto; for(Object o:ol){ xml.append(convertToXml(o,o.getClass().getSimpleName())); } xml.append("</"+firstUpperName+">\n"); } else{ //如果返回值不为null 执行递归调用 xml.append(convertToXml(reto,ctName)); } }else{ //如果为null,直接在这个属性里面设置为空就可以了 xml.append("<"+firstUpperName+">\n</"+firstUpperName+">\n"); } } } } xml.append("</"+root+">\n"); return xml.toString(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return null; } /** * 通过Filed,Class,和Objec对象获取需要生成的对应Filed的字符串 * @param f * @param cz * @param obj * @return * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ private static String getFieldXml(Field f, Class<?> cz, Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ String fName = f.getName(); String firstUpperName = fName.substring(0, 1).toUpperCase()+fName.substring(1); String str = "<"+firstUpperName+">"; String methodName = "get" +firstUpperName; Class<?>[] cnull = null; Method m=cz.getMethod(methodName, cnull); Object[] osnull =null; Object reto=m.invoke(obj, osnull); if(null!=reto){ Class<?> ct =f.getType(); String ctName = ct.getSimpleName(); if("int".equals(ctName) || "long".equals(ctName)){ if("0".equals(reto.toString())){ System.err.println(fName +" 对应的值为0"); } str +=reto.toString(); }else if("double".equals(ctName)|| "float".equals(ctName)){ if("0.0".equals(reto.toString())||"0".equals(reto.toString())){ System.err.println(fName +" 对应的值为0"); } str +=reto.toString(); }else{ str +="<![CDATA["+reto.toString()+"]]>"; } }else{ System.err.println(fName +" 对应的值为空"); } str +="</"+firstUpperName+">"; return str; } /** * 通过xml字符串转换成给定类的对象 * @param xml * 需要转成对象的字符串 * @param c * 返回对象的类[Class] * @return * 返回对象的实例 * <br> * 1.转换过程中不会操作任何xml的属性操作,值是一个标签对应一个属性来操作的 * <br> * 2.参数Class<?> c对应的类,需要设置的属性都必须有getter,setter方法 */ public static <T> T converyToJavaBean(String xml, Class<T> c) { T t = null; try { t= c.newInstance(); SAXBuilder sb = new SAXBuilder(); StringReader read = new StringReader(xml); InputSource source = new InputSource(read); Document doc = sb.build(source); Element root =doc.getRootElement(); convery(root,c,t); } catch (Exception e) { e.printStackTrace(); } return t; } private static void convery(Element e,Class<?> clazz,Object o) throws SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{ // System.out.println("el.size = "+el.size()); // String text = e.getTextTrim(); // System.out.println("text = "+text); String en =e.getName(); if("xml".equals(en)){ List<Element> el = e.getChildren(); for(Element e1:el){ convery(e1,clazz,o); } }else{ List<Element> el = e.getChildren(); if(el.size()>0){ String childClassName =e.getName(); String methodName = "get" +childClassName.substring(0, 1).toUpperCase()+childClassName.substring(1); Class<?> clazz1 = null; Method[] ms = clazz.getMethods(); for(Method m:ms){ // System.out.println(m.getName()); if(methodName.equals(m.getName())){ clazz1 = m.getReturnType(); } } // try { // clazz1 = Class.forName(ncn); // } catch (Exception e2) { // System.err.println(ncn + " 实例化失败,请检查是否存在这个类 "); // } if(null==clazz1){ //没有找到对应的类,这里只是忽略 System.out.println(methodName + " 方法未找到,或者返回类型不正确 "); return; } Object o1 = clazz1.newInstance(); try { //反射获取set方法,帮o1的值设置进o里面 Method m =clazz.getMethod(methodName, clazz1); m.invoke(o, o1); } catch (Exception e2) { //应该是没有找到对应的方法,忽略 System.err.println(methodName +" 方法调用失败,请检查方法是否存在"); return ; } for(Element e1:el){ convery(e1,clazz1,o1); } }else{ String eName = e.getName(); String methodName = "set" +eName.substring(0, 1).toUpperCase()+eName.substring(1); Method[] ms=clazz.getMethods(); for(Method m:ms){ if(m.getName().equals(methodName)){ Class<?>[] c= m.getParameterTypes(); //目前只支持带一个参数的情况 String text = e.getTextTrim(); Object v = null; String cn = c[0].getSimpleName(); if("int".equals(cn)){ v = Integer.parseInt(text); }else if("long".equals(cn)){ v= Long.parseLong(text); }else if("double".equals(cn)){ v = Double.parseDouble(text); }else if("float".equals(cn)){ v = Float.parseFloat(text); }else{ v = text; } m.invoke(o,v); } } } } } public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, JDOMException, IOException, ParserConfigurationException, InstantiationException { ReMusicMsg rmm = new ReMusicMsg(); Music m = new Music(); m.setTitle("小苹果"); m.setDescription("小苹果"); m.setMusicUrl("http://yinyueshiting.baidu.com/data2/music/122112390/12012502946800128.mp3?xcode=b7d19aa0a1f43850273d9292ca2357ec3f8882ee658cd7de"); m.setHQMusicUrl("http://yinyueshiting.baidu.com/data2/music/122112390/12012502946800128.mp3?xcode=b7d19aa0a1f43850273d9292ca2357ec3f8882ee658cd7de"); rmm.setMusic(m); rmm.setMsgType("music"); rmm.setCreateTime((int)(System.currentTimeMillis()/1000)); rmm.setFromUserName("gh_32a91b043d76"); rmm.setToUserName("os6Z4swOSB6pzVDtA90g0Fq4Dz_4"); rmm.setFuncFlag(1); rmm.setMsgId(6051426418514665443l); rmm.setMsgType("music"); String xml =convertToXml(rmm,null); System.out.println(xml); xml = "<xml><ToUserName><![CDATA[gh_32a91b043d76]]></ToUserName>/n<FromUserName><![CDATA[os6Z4swOSB6pzVDtA90g0Fq4Dz_4]]></FromUserName>/n<CreateTime>1409041861</CreateTime>/n<MsgType><![CDATA[text]]></MsgType>/n<Content><![CDATA[哈哈]]></Content>/n<MsgId>6051788711890992105</MsgId>/n</xml>/n"; xml =xml.replaceAll(">/n", ">"); System.out.println(xml); Message ms = converyToJavaBean(xml, Message.class); System.out.println(ms.getMsgType()); } }
使用和约束什么的,在方法头部已经写出来了,这里就不多说了,
如果你想测试的话,可能需要一下jar和一些自定义的类,
自定义的类你可以更具用到的属性直接写一个就行了,就是简单的属性和getter setter方法
jar包应该只要jdom的就可以了
已添加附件
相关推荐
在Java编程中,我们经常需要将XML数据转换为Java对象,也就是所谓的Java Bean,以便于处理和操作。Java Bean是符合一定规范的Java类,通常具有getter和setter方法,用于封装数据。 XML到Java Bean的转换可以手动...
xml 与 bean 互相转换 工具类 1、bean类的属性需要遵守BEAN规范,否则 无法 读存BEAN值。 2、bean类的属性如果 是集合 只支持数组以及List、Map、Set。 3、bean类属性(boolean除外)前面两个字母要么全部小写,要么...
在Java开发中,XML(可扩展标记语言)和Bean之间的互相转换是一项常见的任务,尤其是在处理配置文件、数据交换或者序列化场景中。本篇将详细阐述XML与Bean之间的转换过程,以及相关的Java技术。 首先,XML是一种...
XStream不仅能够将Java对象转换为XML,还可以反向将XML转换回Java对象,极大地简化了对象与XML之间的序列化和反序列化过程。 XStream库是由Johannes Lehtinen创建的一个开源项目,它是基于Java的,可以处理复杂的...
总结来说,这个压缩包提供的内容涉及了Java中使用JAXB进行XML与Java对象之间转换的实际应用,以及辅助的DTO和文件读取工具。这些对于理解和实现XML数据处理的Java应用非常有帮助。开发者可以通过学习和使用这些示例...
- **使用JAXB(Java Architecture for XML Binding)**:JAXB是Java标准API,可以自动将Java对象转换为XML和从XML反序列化为Java对象。只需为JavaBean添加适当的注解,然后使用JAXBContext和Marshaller进行转换。 ...
本篇将详细介绍两种常用的Java XML与Bean互转方法:XStream库和JAXB(Java Architecture for XML Binding)框架。 一、XStream库 1. **XStream简介**: XStream是一个用于Java的轻量级库,它提供了一种简单的API来...
主要介绍了Java Bean与xml互相转换的方法,结合实例形式分析了java bean与xml转换的原理与相关操作技巧,需要的朋友可以参考下
JAXB允许我们将Java类绑定到XML Schema,从而能够方便地在Java对象和XML文档之间进行转换。要使用JAXB,你需要定义一个Java类,该类的字段对应于XML元素,然后使用JAXB提供的API将该对象转换为XML。 以下是一个简单...
2. Bean到XML转换: 反之,如果你有一个Java对象并且希望将其转换为XML格式,Castor也能轻松实现。通过调用Castor提供的序列化方法,你可以将Java对象转换为XML字符串或直接写入XML文件。这样,Java对象的数据就以...
在Java开发中,数据对象(通常称为Bean)与XML之间的转换是常见的需求,尤其是在处理配置文件、序列化或网络通信时。Betwixt是一个Apache软件基金会提供的库,专门用于XML与Java对象之间的绑定,使得我们可以方便地...
在提供的文件`ClassToXml.java`和`CC.java`中,很可能是实现了XML到Bean或Bean到XML转换的示例代码。具体实现细节需要查看源代码才能理解。通常,这些类会包含对JAXB API的调用,如创建JAXBContext、Unmarshaller和...
在这个"JAXBContext测试Java对象与xml的相互转换Demo"中,我们将深入探讨如何利用JAXBContext实现这一功能。 首先,我们需要定义一个Java类,这个类将被映射为XML文档的元素。例如,我们可以创建一个`Person`类,...
Java中的Apache Commons Betwixt库提供了一个简单的方法来映射Java Bean对象和XML文档之间的数据,使得在处理数据交换时能轻松地实现bean到XML的转换和XML到bean的反转换。本篇文章将深入探讨如何使用Commons ...
当一个Java对象被转换为XML时,JAXB会根据对象的属性和注解生成相应的XML元素和属性。例如,一个名为`Person`的类,包含`name`和`age`属性,可以通过以下方式标注: ```java @XmlRootElement(name = "person") ...
在Java开发中,XML(可扩展标记语言)和Bean之间的相互转换是常见的操作,尤其是在处理配置文件、数据持久化或Web服务时。这里的"bean"通常指的是JavaBeans,即符合特定设计模式的Java对象,它们封装了数据并提供了...
压缩包中的`trang.jar`可能是一个用于XML转换的工具,而`java中对象与xml相互转换.doc`可能是关于如何在Java中实现对象和XML之间转换的详细文档,涵盖了上述的一些技术点。 总之,Java XML处理技术是开发者必须掌握...
5. **生成序列化和反序列化代码**:为了方便XML数据和Java对象之间的转换,工具还会生成解析XML和生成XML的代码,通常是基于JAXB(Java Architecture for XML Binding)或其他类似库。 除了XSD转Java,有些工具还...
在IT行业中,XML(eXtensible Markup Language)与Java Bean之间的转换是一个常见的需求,特别是在数据持久化、网络通信和配置文件处理等场景。本文将深入探讨如何利用Java技术实现XML到Bean以及Bean到XML的双向解析...
总之,"Converter between XML and Java Bean"涉及的关键知识点是利用如XStream这样的库实现XML与Java对象之间的转换,这在Java开发中是非常重要且实用的技能,尤其在处理数据交换、持久化存储和跨系统通信时。...