`
ziyu_1
  • 浏览: 194159 次
  • 来自: ...
社区版块
存档分类
最新评论

把xml转换成map

    博客分类:
  • java
XML 
阅读更多
传过来一个xml文件,需要转换成Map,能够应对不用结构的xml,而不是只针对固定格式的xml.
转换规则:
1.主要是Map与List的互相嵌套
2.同名称的节点会被装进List

如下面的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<GmMail>
	<template_id>2</template_id>
	<to_address>test@corp.gm.com</to_address>
	<to_alias>tom</to_alias>
	<message>XML-未来世界 Message</message>
	<recipient_name>xml-tom</recipient_name>
	<send_address>xml-test@163.com</send_address>
	<sender_comp_name>xml-gm</sender_comp_name>
	<subject>xml-hello guys</subject>
	<selected_items>
		<item_group>
			<item_url>http://china.gm.com</item_url>
			<item_name>gm中文站</item_name>
			<item_desc>gm中文站desc</item_desc>
			<item_desc2>gm中文站desc2</item_desc2>
			<item_desc3>gm中文站desc3</item_desc3>
			<item_desc4>gm中文站desc4</item_desc4>
		</item_group>
		<items_source>products</items_source>
		<item_group>
			<item_url>http://www.gm.com</item_url>
			<item_name>gm</item_name>
			<item_desc>gmdesc</item_desc>
		</item_group>
	</selected_items>
	<attachments>
		<attachment-group>
			<attachment_url>
				http://china.gm.com/pics/com.cn.gm/story/frsc.jpg
			</attachment_url>
			<attachment_name>黄晓豫</attachment_name>
			<attachment_desc>
				<desc1>attach-desc1</desc1>
				<desc2>attach-desc2</desc2>
				<desc3>attach-desc3</desc3>
				<desc4>attach-desc4</desc4>
			</attachment_desc>
		</attachment-group>
		<attachment-group>
			<attachment_url>
				http://china.gm.com/pics/com.cn.gm/story/wr.jpg
			</attachment_url>
			<attachment_name>张中汉</attachment_name>
			<attachment_desc>
				<desc1>attach-desc1</desc1>
				<desc2>attach-desc2</desc2>
			</attachment_desc>
			<attachment_desc>
				<desc1>attach-desc1</desc1>
				<desc2>attach-desc2</desc2>
			</attachment_desc>
		</attachment-group>
	</attachments>
	<desc_group>
		<desc_item>desc_item_1</desc_item>
		<desc_item>desc_item_2</desc_item>
		<desc_item>desc_item_3</desc_item>
		<desc_item>desc_item_4</desc_item>
		<desc_item>desc_item_5</desc_item>
	</desc_group>
</GmMail>



转换后的的Map(转换成字符串的效果):
{message=XML-未来世界 Message, selected_items={items_source=products, item_group=[{item_name=gm中文站, item_desc=gm中文站desc, item_desc2=gm中文站desc2, item_desc4=gm中文站desc4, item_url=http://china.gm.com, item_desc3=gm中文站desc3}, {item_name=gm, item_desc=gmdesc, item_url=http://www.gm.com}]}, to_alias=tom, desc_group={desc_item=[desc_item_1, desc_item_2, desc_item_3, desc_item_4, desc_item_5]}, sender_comp_name=xml-gm, subject=xml-hello guys, to_address=test@corp.gm.com, template_id=2, attachments={attachment-group=[{attachment_url=http://china.gm.com/pics/com.cn.gm/story/frsc.jpg, attachment_name=黄晓豫, attachment_desc={desc3=attach-desc3, desc4=attach-desc4, desc1=attach-desc1, desc2=attach-desc2}}, {attachment_url=http://china.gm.com/pics/com.cn.gm/story/wr.jpg, attachment_name=张中汉, attachment_desc=[{desc1=attach-desc1, desc2=attach-desc2}, {desc1=attach-desc1, desc2=attach-desc2}]}]}, recipient_name=xml-tom, send_address=xml-test@163.com}


xml处理用的dom4j

下面是实现转换的主要类XmlUtils:
package xml.dom4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;

public class XmlUtils {
	
	public static Map<String, Object> Dom2Map(Document doc){
		Map<String, Object> map = new HashMap<String, Object>();
		if(doc == null)
			return map;
		Element root = doc.getRootElement();
		for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
			Element e = (Element) iterator.next();
			//System.out.println(e.getName());
			List list = e.elements();
			if(list.size() > 0){
				map.put(e.getName(), Dom2Map(e));
			}else
				map.put(e.getName(), e.getText());
		}
		return map;
	}
	

	public static Map Dom2Map(Element e){
		Map	map = new HashMap();
		List list = e.elements();
		if(list.size() > 0){
			for (int i = 0;i < list.size(); i++) {
				Element iter = (Element) list.get(i);
				List mapList = new ArrayList();
				
				if(iter.elements().size() > 0){
					Map m = Dom2Map(iter);
					if(map.get(iter.getName()) != null){
						Object obj = map.get(iter.getName());
						if(!obj.getClass().getName().equals("java.util.ArrayList")){
							mapList = new ArrayList();
							mapList.add(obj);
							mapList.add(m);
						}
						if(obj.getClass().getName().equals("java.util.ArrayList")){
							mapList = (List) obj;
							mapList.add(m);
						}
						map.put(iter.getName(), mapList);
					}else
						map.put(iter.getName(), m);
				}
				else{
					if(map.get(iter.getName()) != null){
						Object obj = map.get(iter.getName());
						if(!obj.getClass().getName().equals("java.util.ArrayList")){
							mapList = new ArrayList();
							mapList.add(obj);
							mapList.add(iter.getText());
						}
						if(obj.getClass().getName().equals("java.util.ArrayList")){
							mapList = (List) obj;
							mapList.add(iter.getText());
						}
						map.put(iter.getName(), mapList);
					}else
						map.put(iter.getName(), iter.getText());
				}
			}
		}else
			map.put(e.getName(), e.getText());
		return map;
	}

}



下面是一个创建xml的类(不重要,可以忽略,只是用来生成一个xml以便测试,可以自己写)
package xml.dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class CreateXml {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	public Document createXml(){
		Document doc = DocumentHelper.createDocument();
		Element e = doc.addElement("GmMail");
		e.addElement("template_id").setText("2");
		e.addElement("to_address").setText("test@corp.gm.com");
		e.addElement("to_alias").setText("tom");
		e.addElement("message").setText("XML-未来世界 Message");
		e.addElement("recipient_name").setText("xml-tom");
		e.addElement("send_address").setText("xml-test@163.com");
		e.addElement("sender_comp_name").setText("xml-gm");
		e.addElement("subject").setText("xml-hello guys");
		Element Selecteditems = e.addElement("selected_items");
			
				Element itemsGroup = Selecteditems.addElement("item_group");
			//Element item = itemsGroup.addElement("item");
					itemsGroup.addElement("item_url").setText("http://china.gm.com");
					itemsGroup.addElement("item_name").setText("gm中文站");
					itemsGroup.addElement("item_desc").setText("gm中文站desc");
					itemsGroup.addElement("item_desc2").setText("gm中文站desc2");
					itemsGroup.addElement("item_desc3").setText("gm中文站desc3");
					itemsGroup.addElement("item_desc4").setText("gm中文站desc4");
				Selecteditems.addElement("items_source").setText("products");
				itemsGroup = Selecteditems.addElement("item_group");
					itemsGroup.addElement("item_url").setText("http://www.gm.com");
					itemsGroup.addElement("item_name").setText("gm");
					itemsGroup.addElement("item_desc").setText("gmdesc");
		Element attachment = e.addElement("attachments");
			Element attachmentGroup =	attachment.addElement("attachment-group");
				attachmentGroup.addElement("attachment_url").setText("http://china.gm.com/pics/com.cn.gm/story/frsc.jpg");
				attachmentGroup.addElement("attachment_name").setText("黄晓豫");
					Element attachmentDesc = attachmentGroup.addElement("attachment_desc");
					attachmentDesc.addElement("desc1").setText("attach-desc1");
					attachmentDesc.addElement("desc2").setText("attach-desc2");
					attachmentDesc.addElement("desc3").setText("attach-desc3");
					attachmentDesc.addElement("desc4").setText("attach-desc4");
			attachmentGroup =	attachment.addElement("attachment-group");
				attachmentGroup.addElement("attachment_url").setText("http://china.gm.com/pics/com.cn.gm/story/wr.jpg");
				attachmentGroup.addElement("attachment_name").setText("张中汉");
					attachmentDesc = attachmentGroup.addElement("attachment_desc");
						attachmentDesc.addElement("desc1").setText("attach-desc1");
						attachmentDesc.addElement("desc2").setText("attach-desc2");
					attachmentDesc = attachmentGroup.addElement("attachment_desc");
						attachmentDesc.addElement("desc1").setText("attach-desc1");
						attachmentDesc.addElement("desc2").setText("attach-desc2");
		Element descGroup = e.addElement("desc_group");
			descGroup.addElement("desc_item").setText("desc_item_1");
			descGroup.addElement("desc_item").setText("desc_item_2");
			descGroup.addElement("desc_item").setText("desc_item_3");
			descGroup.addElement("desc_item").setText("desc_item_4");
			descGroup.addElement("desc_item").setText("desc_item_5");
		return doc;
	}
}



下面是main调用类:
package xml.dom4j;

import java.util.Map;

import org.dom4j.Document;

public class Demo {
	
	public static void main(String[] args){
		CreateXml create = new CreateXml();
		Document doc = create.createXml();
		String strXml = doc.asXML();
		System.out.println(strXml);
		
		Map map = XmlUtils.Dom2Map(doc);
		
		System.out.println(map.toString());
	}

}

分享到:
评论
3 楼 ziyu_1 2012-06-29  
helwens 写道
这个工具的局限性在于不能解析出节点属性

因为当时没这个需求,也就没考虑。如果要解析属性的话,就复杂了
2 楼 helwens 2012-04-05  
这个工具的局限性在于不能解析出节点属性
1 楼 crazycl 2010-12-17  
楼主,能把Map再转换回XML吗?

相关推荐

    java将xml串转换成Map类型

    将xml串转换成Map类型,如果有重复节点,自动转换为list类型存储,所以最终转换并非绝对Map

    Java xml转化为map

    - Apache Commons Digester库提供了一种规则驱动的方式来将XML转换为Map,通过定义匹配规则,当匹配到XML中的某个模式时,它会调用相应的处理方法。 4. **自定义转换器**: - 如果XML结构复杂,也可以自定义转换...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    本篇文章将详细介绍如何将Map和List集合转换为XML字符串,以及如何将XML字符串反向转换回Map和List集合。 首先,让我们探讨`Map`集合转成XML字符串的过程。一个`Map`对象存储键值对,可以使用各种库如`JAXB (Java ...

    java一键xml转map,一键map转xml工具类

    在`EasyXmlUtil`类中,这两个方法的实现可能会使用递归处理Map的层级结构,以确保复杂的嵌套Map也能正确地转换成XML。同时,为了处理XML的特殊字符,如&lt;、&gt;等,工具类可能还包含了字符转义的逻辑。 关于`maven依赖....

    Map转换成xml

    ### Map转换为XML的知识点详解 在Java编程中,将数据结构如`Map`转换为XML格式是一种常见的需求,尤其是在处理配置文件、数据交换或与Web服务交互时。以下是对如何实现这一转换的深入解析,涵盖了代码逻辑、关键...

    java转换xml、list、map和json

    "java转换xml、list、map和json" ...本文主要讲述了Java中将xml、list、map和json之间的转换的相关知识点,包括xml和map之间的转换、xml和list之间的转换、xml和json之间的转换、map和json之间的转换等。

    java xml和map互转

    `mapToXml`方法则将Map转换成XML字符串: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.util.Map; public class XmlMapConverter { // ... xml...

    jaxb xml 转map

    将XML转换为Map可以使数据处理更加灵活,因为Map的键值对形式非常适合存储和操作键标识的数据。 首先,我们需要了解JAXB的基本用法。JAXB的工作原理是基于Java类来生成XML schema,或者反过来基于XML schema生成...

    Java xml 转 map

    将XML转换为Map,主要是为了方便数据处理和操作。这个过程通常涉及到XML解析和数据映射。 在描述中提到的“递归 XML 转 MAP”,是指XML文档可能存在嵌套结构,递归方法是处理这种结构的有效手段。递归意味着函数...

    xml与map相互转换

    xml与map转换 这个应用的情况并不多见,一般都在两个系统间沟通的时候会有xml和json的相互转换。因为map和json是天生可相互转换的,所以这里只有xml能和map进行转换,那json就不是问题了。

    xml2map:XML到MAP转换器的Golang编写

    XML到MAP转换器的Golang编写的转换器 有时需要表示以前未知的结构。 这种通用表示形式通常是JSON,XML或数据映射结构形式的字符串。 类似于map [string] interface {}或map [interface {}] interface {}。 这是从...

    解析xml文件-转换map新增数据库

    解析xml文件-转换map新增数据库解析xml文件-转换map新增数据库

    将xml字符串与map互转

    这是一个很好用的工具栏,可以将xml字符串转换成map,或者将Map集合转换为xml字符串

    Jackson 框架JSON、XML、List、Map直接相互转换

    NULL 博文链接:https://bugyun.iteye.com/blog/2278997

    MAP<---&gt;XML格式互相转换接口,已封装,可直接使用(java版)

    在Java开发中,数据结构的转换是常见的任务之一,例如将Map对象转换为XML格式的字符串,或者将XML数据解析成Map对象。标题提到的"MAP&lt;---&gt;XML格式互相转换接口,已封装,可直接使用(java版)"正是这样一个工具,它...

    Java读取json文件,并转化为map取值

    本教程将深入讲解如何使用Java读取JSON文件,并将其内容转化为Map以便进行取值操作。 首先,我们需要引入处理JSON的库。Java标准库并不直接支持JSON操作,所以我们通常会使用第三方库,如`org.json`或`...

    java转换xml、list、map和json.docx

    2. **Map到XML转换**: - 同样,首先创建一个DOM文档对象,然后添加根元素。 - 遍历Map的键值对,将每个键值对转换为XML元素,添加到根元素下。 - 注意添加属性和文本内容的方式。 3. **List到XML转换**: - ...

    java转换xml、list、map和json[借鉴].pdf

    3. Map到XML转换: - `maptoXml` 方法:这个方法接收一个Map对象,创建一个XML文档,然后遍历Map的键值对,为每个键创建一个`&lt;key&gt;`元素,并设置属性`label`为键的值,元素的文本为对应的值。最后,使用`doc2String...

    java转换xml、list、map和json.pdf

    2. **Map到XML转换**: - `doc2String()`方法(未在代码中显示)应该是将`Document`对象转换为字符串的方法,通常会使用`OutputFormat`和`XMLWriter`来格式化输出的XML字符串。 3. **XML到List转换**: - `...

    MFC序列化到xml文档,支持STL的vector,map,pair

    当扩展到XML时,我们需要一个XML序列化类,它可以遍历CObject及其派生类,并将数据转换为XML格式。对于STL容器,我们需要额外的逻辑来处理每个元素的序列化。 对于vector,我们可以通过迭代其元素并调用每个元素的...

Global site tag (gtag.js) - Google Analytics