项目中很多时候需要将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、和自定义类上通过。
相关推荐
JAXB与其他XML处理技术(如DOM、SAX、StAX)相比,更注重于对象模型与XML之间的绑定,适用于需要频繁进行对象与XML转换的场景。而DOM适合处理小规模的XML文档,SAX和StAX则适用于大文件流式处理。 总结,JAXB是Java...
本篇将深入探讨Object-XML转换的相关知识点,并以Spring框架中的Object-XML映射为例进行详细解析。 首先,让我们理解Object-XML转换的基本概念。在Java中,我们将一个对象转换为XML的过程称为对象序列化,反之称为...
在编程领域,Object与XML之间的转换是常见的数据处理任务,特别是在数据交换、持久化存储或者网络通信中。Object转XML和XML转Object的过程涉及到对象序列化和反序列化的概念。 对象序列化是将一个对象的状态转化...
simple-xml2object是一个简单实用的xml和JAVA对象转换的类库,jar包很小,而且不需要任何依赖包。 下载后,压缩包包含一个jar包,导入即可。包含一个测试类,有详细的注释展示用法。还包含一个中文文档。
本教程将详细讲解如何将XML文件读取并转换为Object,以便在游戏开发中更有效地操作数据。 1. XML基础 XML是一种标记语言,它通过标签来描述数据的结构和内容。例如,一个简单的XML文件可能如下所示: ```xml ...
前段时间找了好久xml与object之间的转换都没找到!最近在学习WebService,讲到JAXB!没听说过!看了才知道jdk中自带了这个功能,什么这个框架那个框架都用了!原来就在眼前你也不知道!我这儿有视频,有需要请留言!...
标题中的“XStream实现Object与XML转换解决方案”指的是一个Java库——XStream,它提供了一种简单的方法来序列化和反序列化Java对象到XML,反之亦然。这个库广泛用于将程序数据保存到XML文件或者从XML数据恢复对象,...
- `Gson`库也可以实现对象到JSON字符串的转换,然后通过JSON到XML的转换库如`json.org`的XML转换功能间接实现XML序列化。 3. **对象反序列化**: - 将XML数据转换回Java对象的过程称为反序列化。`JAXB`可以将XML...
《简单实用:XML与对象之间的转换工具——simple-xml2object-1.0.0》 在信息技术领域,数据交换和存储的方式多种多样,其中XML(eXtensible Markup Language)因其结构化、可扩展性及跨平台特性,被广泛用于数据...
- `xmlread`: 这个函数用于从XML文件中读取数据,返回一个XML DOM(Document Object Model)对象。DOM是一种树形结构,表示XML文档的所有元素和属性。 - `xmlstruct`: 该函数将DOM对象转换为Matlab结构体,使得数据...
"XML转换为JSON"的过程是将XML格式的数据转换成JSON格式,以便于在支持JSON的环境中更好地处理和传输。这个过程通常涉及到以下几个关键步骤: 1. **解析XML**:首先,我们需要解析XML文档,将其解析成一个解析树或...
本文将详细介绍如何使用`convertXML2Object`库将对象转换为XML,并将XML转换为Node.js中的对象。这个库是JavaScript开发中的一个工具,它简化了XML与JSON对象之间的转换,使得数据操作更为便捷。 首先,让我们了解...
简介:xxoo是一个简单实用的xml和JAVA对象转换的类库,jar包很小,而且不需要任何依赖包(需1.5或1.5以上JDK环境)。解压后,有一个jar包,这就是xxoo的核心包,导入到项目即可使用。里面还有一个cn文件夹,那是博主...
XStream是一款强大的库,它使得Java对象与XML之间的转换变得简单易行。本篇文章将深入探讨如何利用XStream进行Java对象到XML的转换,并将其存储到SD卡上。 首先,XStream的核心功能在于它可以将Java对象直接转换为...
在XMLSpy中,你可以方便地进行XML文件的创建、编辑、格式化、验证以及转换,包括将XML转换为XHTML或HTML等其他格式。 XML(eXtensible Markup Language)是一种标记语言,用于存储和传输结构化数据。它的主要特点是...
在实际开发中,有许多工具和库可以帮助进行XML转换,例如Java的JAXB、XMLBeans,Python的lxml,以及命令行工具如xsltproc(XSLT处理器)和xmlstarlet。这些工具提供了方便的API和命令行选项,使得XML转换变得简单。 ...
ObjectToXml,object类型转换为xml类型,xml类型转换为object类型
这个"JSON与XML转换jar包"显然是为了帮助开发者在两者之间进行数据格式的转换,以满足不同场景的需求。在实际开发中,有时我们需要将JSON数据解析为XML,或者将XML文档转化为JSON格式,以便在不同的系统或服务之间...
转换为对象 xmlToObject.vo.Request(自定义) 里面还包含其他对象。 转成的对象 已JSON格式后台输出 {"body":{"class":"xmlToObject.vo.ReqBody","list":[{"class":"xmlToObject.vo.Foot","name":"红豆","rmb":"10...
然而,为了在Java应用程序中方便地处理这些数据,通常需要将XML转换为Java对象,反之亦然。这个过程被称为XML绑定。 XML绑定技术允许开发者通过简单的API将XML文档映射到Java对象,以及将Java对象转换为XML文档。...