`

XML转换Object

 
阅读更多

   项目中很多时候需要将xml内容转换成java对象来处理,这样一来数据就直观,操作起来也更加方便,  

  下面介绍下如何通过java将xml内容转换java对象。

    1、MyXml.xml

<?xml version="1.0" encoding="UTF-8"?>
<sysConfig id="sys">
	<say id="a" name="b">
		<content value="xx"></content>
	</say>
	<hello id="a" name="b">
		<content value="xx"></content>
	</hello>
	<hello id="a" name="b">
		<content value="xx"></content>
	</hello>
	<Test id="a" name="b">
		<content value="xx"></content>
		<content value="xx"></content>
	</Test>
	<ArrayTest id="a" name="b">
		<content value="xx1"></content>
		<content value="xx2"></content>
	</ArrayTest>
	<ArrayTest id="a" name="b">
		<content value="xx3"></content>
		<content value="xx4"></content>
	</ArrayTest>
</sysConfig>

    2、对应java类结构

/**
 * 
 */
package org.common.util;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

class Base {
	SysConfig sysConfig;

	public SysConfig getSysConfig() {
		return sysConfig;
	}

	public void setSysConfig(SysConfig sysConfig) {
		this.sysConfig = sysConfig;
	}
}

class A extends Base {
	@Override
	public String toString() {
		return "A [sysConfig=" + sysConfig + "]";
	}

}

class B {
	SysConfig sysConfig;

	public SysConfig getSysConfig() {
		return sysConfig;
	}

	public void setSysConfig(SysConfig sysConfig) {
		this.sysConfig = sysConfig;
	}

	@Override
	public String toString() {
		return "B [sysConfig=" + sysConfig + "]";
	}

}

class SysConfig {
	Say say;
	String id;
	Hello[] hello;
	Test test;
	ArrayTest[] arrayTest;

	public Say getSay() {
		return say;
	}

	public void setSay(Say say) {
		this.say = say;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Hello[] getHello() {
		return hello;
	}

	public void setHello(Hello[] hello) {
		this.hello = hello;
	}

	public Test getTest() {
		return test;
	}

	public void setTest(Test test) {
		this.test = test;
	}

	public ArrayTest[] getArrayTest() {
		return arrayTest;
	}

	public void setArrayTest(ArrayTest[] arrayTest) {
		this.arrayTest = arrayTest;
	}

	@Override
	public String toString() {
		return "SysConfig [arrayTest=" + Arrays.toString(arrayTest) + ", hello=" + Arrays.toString(hello) + ", id="
				+ id + ", say=" + say + ", test=" + test + "]";
	}

}

class Hello {
	Content content;
	String id;
	String name;

	public Content getContent() {
		return content;
	}

	public void setContent(Content content) {
		this.content = content;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Hello [content=" + content + ", id=" + id + ", name=" + name + "]";
	}

}

class Say {
	Content content;
	String id;
	String name;

	public Content getContent() {
		return content;
	}

	public void setContent(Content c) {
		this.content = c;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Say [c=" + content + ", id=" + id + ", name=" + name + "]";
	}

}

class Test {
	Content[] content;

	public Content[] getContent() {
		return content;
	}

	public void setContent(Content[] content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "Test [content=" + Arrays.toString(content) + "]";
	}

}

class ArrayTest {
	Content[] content;

	public Content[] getContent() {
		return content;
	}

	public void setContent(Content[] content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "Test [content=" + Arrays.toString(content) + "]";
	}

}

class Content {
	String value;

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	@Override
	public String toString() {
		return "content [value=" + value + "]";
	}
}

/**
 * @author Administrator
 * 
 */
public class Example {

	/**
	 * @param args
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws SAXException
	 * @throws ClassNotFoundException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws DOMException
	 * @throws IllegalArgumentException
	 */
	public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException,
			IllegalArgumentException, DOMException, InstantiationException, IllegalAccessException,
			InvocationTargetException, ClassNotFoundException {
		Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
				"\\WebRoot\\WEB-INF\\classes\\org\\common\\util\\MyXml.xml");
		A a = (A) XMLToObject.getInstance().transform(doc, A.class, true);
		System.out.println(a.toString());
		B b = (B) XMLToObject.getInstance().transform(doc, B.class, false);
		System.out.println(b.toString());
	}

}

 

  3、实现类XMLToObject.java

  

/**
 * 
 */
package org.common.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author yangguangftlp
 * 
 */
@SuppressWarnings("unchecked")
public class XMLToObject {

	public static String M_SET = "set";
	private static XMLToObject instance;

	private XMLToObject() {

	}

	/**
	 * 获取实例
	 * 
	 * @return
	 */
	public static XMLToObject getInstance() {
		if (null == instance) {
			synchronized (XMLToObject.class) {
				if (null == instance) {
					instance = new XMLToObject();
				}
			}
		}
		return instance;
	}

	/**
	 * 将xml转换Object
	 * 
	 * @param doc
	 *            文档对象
	 * @param objClass
	 *            class
	 * @param flag
	 *            是否获取 objClass 继承的所有方法
	 * @return 返回 生成objClass 实例对象
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * @throws DOMException
	 * @throws ClassNotFoundException
	 */
	public Object transform(Document doc, Class objClass, boolean flag) throws InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, DOMException,
			ClassNotFoundException {
		if (null == doc) {
			throw new IllegalArgumentException("doc is null!");
		}
		if (null == objClass) {
			throw new IllegalArgumentException("objClass is null!");
		}
		return doRootNode(doc.getDocumentElement(), objClass.newInstance(), flag);
	}

	public Object doRootNode(Element root, Object obj, boolean flag) throws ClassNotFoundException,
			IllegalAccessException, InvocationTargetException, InstantiationException {
		if (null != root) {
			// 获取obj上所有定义public方法
			Method method = getMethods(M_SET, obj.getClass(), flag).get(generateMethodName(M_SET, root.getNodeName()));
			if (null != method && method.getParameterTypes().length == 1) {
				Class paramType = method.getParameterTypes()[0];
				if (!paramType.isArray() && !paramType.isPrimitive()) {
					Object paramObj = paramType.newInstance();
					// 处理节点属性
					doAttributes(root, paramObj, getMethods(M_SET, paramType, flag));
					method.invoke(obj, paramObj);
					// 获取子节点
					doChildNode(root.getChildNodes(), paramObj, flag);
				}
			}
		}
		return obj;
	}

	/**
	 * 通过节点名称构造方法名
	 * 
	 * @param prefix
	 *            get
	 * @param name
	 *            节点名称
	 * @return 返回方法名
	 */
	private String generateMethodName(String prefix, String name) {
		return new StringBuffer(prefix).append(Character.toUpperCase(name.charAt(0))).append(name.substring(1))
				.toString();
	}

	/**
	 * 处理属性
	 * 
	 * @param root
	 * @param paramObj
	 * @param temp
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public void doAttributes(Node node, Object paramObj, Map<String, Method> methods) throws IllegalAccessException,
			InvocationTargetException {
		// 处理node属性
		Method method = null;
		Node nameNode = null;
		NamedNodeMap nameNodeMap = node.getAttributes();
		if (null != nameNodeMap) {
			for (int i = 0, length = nameNodeMap.getLength(); i < length; i++) {
				nameNode = nameNodeMap.item(i);
				method = methods.get(generateMethodName(M_SET, nameNode.getNodeName()));
				if (null != method && method.getParameterTypes().length == 1
						&& (method.getParameterTypes()[0] == String.class)) {
					method.invoke(paramObj, nameNode.getNodeValue());
				}
			}
		}
	}

	/**
	 * 处理子节点
	 * 
	 * @param nodeList
	 * @param obj
	 * @param flag
	 * @return
	 * @throws IllegalArgumentException
	 * @throws DOMException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws InstantiationException
	 * @throws ClassNotFoundException
	 */
	public Object doChildNode(NodeList nodeList, Object obj, boolean flag) throws IllegalArgumentException,
			DOMException, IllegalAccessException, InvocationTargetException, InstantiationException,
			ClassNotFoundException {
		if (null != nodeList) {
			Map<String, Method> methodMap = getMethods(M_SET, obj.getClass(), flag);
			Map<String, List<Object>> objMap = new HashMap<String, List<Object>>();
			Method method = null;
			Node childNode = null;
			String methodName = null;
			Object paramObj = null;
			for (int i = 0, len = nodeList.getLength(); i < len; i++) {
				childNode = nodeList.item(i);
				if (childNode instanceof Element) {
					methodName = generateMethodName(M_SET, childNode.getNodeName());
					method = methodMap.get(methodName);
					if (null != method && method.getParameterTypes().length == 1) {
						paramObj = method.getParameterTypes()[0].isArray() ? getParamClass(
								method.getParameterTypes()[0].getName()).newInstance() : method.getParameterTypes()[0]
								.newInstance();
						if (!objMap.containsKey(methodName)) {
							objMap.put(methodName, new ArrayList<Object>());
						}
						doAttributes(childNode, paramObj, getMethods(M_SET, paramObj.getClass(), flag));
						objMap.get(methodName).add(doChildNode(childNode.getChildNodes(), paramObj, flag));
					}
				}

			}
			for (Entry<String, List<Object>> entry : objMap.entrySet()) {
				method = methodMap.get(entry.getKey());
				if (method.getParameterTypes()[0].isArray()) {
					method.invoke(obj, (Object) Arrays.copyOf(entry.getValue().toArray(), entry.getValue().size(),
							(Class) method.getParameterTypes()[0]));
				} else {
					method.invoke(obj, entry.getValue().get(0));
				}
			}
		}
		return obj;
	}

	private Class getParamClass(String name) throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		StringBuffer className = new StringBuffer(name);
		className.delete(0, 2).deleteCharAt(className.length() - 1);
		return Class.forName(className.toString());
	}

	/**
	 * 根据前缀获取class上的方法
	 * 
	 * @param prefix
	 *            方法名前缀
	 * @param cls
	 *            class
	 * @param flag
	 *            自定义方法还是所有方法
	 * @return 返回prefix前缀的所有方法
	 */
	public Map<String, Method> getMethods(String prefix, Class cls, boolean flag) {
		Map<String, Method> methodMap = new HashMap<String, Method>();
		Method[] methods = flag ? cls.getMethods() : cls.getDeclaredMethods();
		if (null != methods) {
			for (Method m : methods) {
				if (m.getName().startsWith(prefix) && Modifier.PUBLIC == m.getModifiers()) {
					methodMap.put(m.getName(), m);
				}
			}
		}
		return methodMap;
	}

	/**
	 * 根据前缀获取class上的方法
	 * 
	 * @param prefix
	 *            方法名前缀
	 * @param cls
	 *            class
	 * @param flag
	 *            自定义方法还是所有方法
	 * @return 返回prefix前缀的所有方法
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 */
	public Method getMethod(String name, boolean flag, Class cls, Class... parameterTypes) throws SecurityException,
			NoSuchMethodException {
		Method method = flag ? cls.getMethod(name, parameterTypes) : cls.getDeclaredMethod(name, parameterTypes);
		return method;
	}
}

 

   4、运行代码

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException,   
            IllegalArgumentException, DOMException, InstantiationException, IllegalAccessException,   
            InvocationTargetException, ClassNotFoundException {   
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(   
                "\\WebRoot\\WEB-INF\\classes\\org\\common\\util\\MyXml.xml");   
        A a = (A) XMLToObject.getInstance().transform(doc, A.class, true);   
        System.out.println(a.toString());   
        B b = (B) XMLToObject.getInstance().transform(doc, B.class, false);   
        System.out.println(b.toString());   
    }   

   结果:

A [sysConfig=SysConfig [arrayTest=[Test [content=[content [value=xx1], content [value=xx2]]], Test [content=[content [value=xx3], content [value=xx4]]]], hello=[Hello [content=content [value=xx], id=a, name=b], Hello [content=content [value=xx], id=a, name=b]], id=sys, say=Say [c=content [value=xx], id=a, name=b], test=Test [content=[content [value=xx], content [value=xx]]]]]
B [sysConfig=SysConfig [arrayTest=[Test [content=[content [value=xx1], content [value=xx2]]], Test [content=[content [value=xx3], content [value=xx4]]]], hello=[Hello [content=content [value=xx], id=a, name=b], Hello [content=content [value=xx], id=a, name=b]], id=sys, say=Say [c=content [value=xx], id=a, name=b], test=Test [content=[content [value=xx], content [value=xx]]]]]

 

  

   规则说明:首先定义数据模型的时候必须提供get和set方法,而且get和set后面的名称必须是xml中的节点名称,例如:Base setSysConfig方法中SysConfig对应xml中的sysConfig,注意xml节点名称首字母不区分大小写(代码会将xml中节点名称首字母变成大写)。

   注意:整个实现是通过java反射来处理, 以上代码实现在属性为string、和自定义类上通过。

  

分享到:
评论

相关推荐

    webservice之使用jaxb把xml转换Object或把对象转换成xml文件

    JAXB与其他XML处理技术(如DOM、SAX、StAX)相比,更注重于对象模型与XML之间的绑定,适用于需要频繁进行对象与XML转换的场景。而DOM适合处理小规模的XML文档,SAX和StAX则适用于大文件流式处理。 总结,JAXB是Java...

    Object-XML文件的相互转换分析

    本篇将深入探讨Object-XML转换的相关知识点,并以Spring框架中的Object-XML映射为例进行详细解析。 首先,让我们理解Object-XML转换的基本概念。在Java中,我们将一个对象转换为XML的过程称为对象序列化,反之称为...

    Object转xml或xml转Object

    在编程领域,Object与XML之间的转换是常见的数据处理任务,特别是在数据交换、持久化存储或者网络通信中。Object转XML和XML转Object的过程涉及到对象序列化和反序列化的概念。 对象序列化是将一个对象的状态转化...

    xml和JAVA对象转换 simple-xml2object

    simple-xml2object是一个简单实用的xml和JAVA对象转换的类库,jar包很小,而且不需要任何依赖包。 下载后,压缩包包含一个jar包,导入即可。包含一个测试类,有详细的注释展示用法。还包含一个中文文档。

    将xml文件读取转换为Object

    本教程将详细讲解如何将XML文件读取并转换为Object,以便在游戏开发中更有效地操作数据。 1. XML基础 XML是一种标记语言,它通过标签来描述数据的结构和内容。例如,一个简单的XML文件可能如下所示: ```xml ...

    xml2object、object2xml之JAXB

    前段时间找了好久xml与object之间的转换都没找到!最近在学习WebService,讲到JAXB!没听说过!看了才知道jdk中自带了这个功能,什么这个框架那个框架都用了!原来就在眼前你也不知道!我这儿有视频,有需要请留言!...

    XStream实现Object与XML转换解决方案

    标题中的“XStream实现Object与XML转换解决方案”指的是一个Java库——XStream,它提供了一种简单的方法来序列化和反序列化Java对象到XML,反之亦然。这个库广泛用于将程序数据保存到XML文件或者从XML数据恢复对象,...

    xml object 互转

    - `Gson`库也可以实现对象到JSON字符串的转换,然后通过JSON到XML的转换库如`json.org`的XML转换功能间接实现XML序列化。 3. **对象反序列化**: - 将XML数据转换回Java对象的过程称为反序列化。`JAXB`可以将XML...

    simple-xml2object-1.0.0

    《简单实用:XML与对象之间的转换工具——simple-xml2object-1.0.0》 在信息技术领域,数据交换和存储的方式多种多样,其中XML(eXtensible Markup Language)因其结构化、可扩展性及跨平台特性,被广泛用于数据...

    matlab读取XML,XML转换为matlab

    - `xmlread`: 这个函数用于从XML文件中读取数据,返回一个XML DOM(Document Object Model)对象。DOM是一种树形结构,表示XML文档的所有元素和属性。 - `xmlstruct`: 该函数将DOM对象转换为Matlab结构体,使得数据...

    XML转换为JSON

    "XML转换为JSON"的过程是将XML格式的数据转换成JSON格式,以便于在支持JSON的环境中更好地处理和传输。这个过程通常涉及到以下几个关键步骤: 1. **解析XML**:首先,我们需要解析XML文档,将其解析成一个解析树或...

    convertXML2Object:将对象转换为XML并将XML转换为NodeJS中的对象的示例

    本文将详细介绍如何使用`convertXML2Object`库将对象转换为XML,并将XML转换为Node.js中的对象。这个库是JavaScript开发中的一个工具,它简化了XML与JSON对象之间的转换,使得数据操作更为便捷。 首先,让我们了解...

    xxoo-1.0.0.RELEASE(原xml和JAVA对象转换 simple-xml2object)

    简介:xxoo是一个简单实用的xml和JAVA对象转换的类库,jar包很小,而且不需要任何依赖包(需1.5或1.5以上JDK环境)。解压后,有一个jar包,这就是xxoo的核心包,导入到项目即可使用。里面还有一个cn文件夹,那是博主...

    使用XStream, java Object 与xml之间的转换,以及写入SD卡

    XStream是一款强大的库,它使得Java对象与XML之间的转换变得简单易行。本篇文章将深入探讨如何利用XStream进行Java对象到XML的转换,并将其存储到SD卡上。 首先,XStream的核心功能在于它可以将Java对象直接转换为...

    xmlspy转换工具

    在XMLSpy中,你可以方便地进行XML文件的创建、编辑、格式化、验证以及转换,包括将XML转换为XHTML或HTML等其他格式。 XML(eXtensible Markup Language)是一种标记语言,用于存储和传输结构化数据。它的主要特点是...

    XML数据转换

    在实际开发中,有许多工具和库可以帮助进行XML转换,例如Java的JAXB、XMLBeans,Python的lxml,以及命令行工具如xsltproc(XSLT处理器)和xmlstarlet。这些工具提供了方便的API和命令行选项,使得XML转换变得简单。 ...

    ObjectToXml

    ObjectToXml,object类型转换为xml类型,xml类型转换为object类型

    JSON与XML转换jar包

    这个"JSON与XML转换jar包"显然是为了帮助开发者在两者之间进行数据格式的转换,以满足不同场景的需求。在实际开发中,有时我们需要将JSON数据解析为XML,或者将XML文档转化为JSON格式,以便在不同的系统或服务之间...

    2017XML字符串转对象Object 实现工具

    转换为对象 xmlToObject.vo.Request(自定义) 里面还包含其他对象。 转成的对象 已JSON格式后台输出 {"body":{"class":"xmlToObject.vo.ReqBody","list":[{"class":"xmlToObject.vo.Foot","name":"红豆","rmb":"10...

    xml转换对象

    然而,为了在Java应用程序中方便地处理这些数据,通常需要将XML转换为Java对象,反之亦然。这个过程被称为XML绑定。 XML绑定技术允许开发者通过简单的API将XML文档映射到Java对象,以及将Java对象转换为XML文档。...

Global site tag (gtag.js) - Google Analytics