xml 转map dom4j
http://ziyu-1.iteye.com/blog/469003
传过来一个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());
}
}
xml 转map dom4j的更多相关文章
- 【dom4j】解析xml为map
dom4j解析xml文件 <?xml version="1.0" encoding="utf-8"?> <workflows> < ...
- Java工具类——通过配置XML验证Map
Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...
- Java的xml与map,与Bean互转
xml与map互转,主要使用dom4j import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j. ...
- xml和map互转工具类
/** * xml转map工具类 * @author zhangyao * */ public class XmlToMapUtil { /** * xml转map 不带属性 * @param xml ...
- xml转Map,对象,Map转xml,inputs tram 转xml 字符串的工具类方法
众所周知,大家在微信开发工程中,由于微信开发文档中,对于消息的接收发送都是基础xml数据的(太坑了),所以我们需要对XML进行解析转换: 1.我们先引入所需要的依赖 dom4j (解析xml的),xs ...
- XML解析与xml和Map集合的互转
1.XML的解析.首先解析XML文件我们需要先获取到文件的存放路径,获取方法有三种分别获取xml文件不同的存放路径. 代码: public class PropertiesDemo { public ...
- Java xml和map,list格式的转换-摘抄
import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.HashMap; import j ...
- Java XML解析工具 dom4j介绍及使用实例
Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...
- 微信 xml 转 Map
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; xml + ...
随机推荐
- 创建PCB原理图的模板
Q:创建PCB原理图的模板,主要就是设置模板的大小,右下角的信息框, 效果图如下: 创建PCB工程 创建原理图 设置模板,方便以后画原理图 打开模板的方式有:1按DO 2双击边框 标题块是附带有的,取 ...
- [NOIp2010提高组]关押罪犯
OJ题号:洛谷1525 思路:贪心. 先将所有的人按怨气值从大到小排一下,然后依次尝试将双方分入两个不同的监狱,如果失败(即已分入相同的监狱),则输出这个怨气值. #include<cstdio ...
- 碰到在Windows中访问局域网文件夹, 提示无法访问时的解决办法
运行:gpedit.msc 找到下图的位置, 启用即可
- Android Developers:传感器概述
大 多数Android设备有内置的传感器,来测量运动,方向和各种环境条件.这些传感器能提供高精度和准确度的原始数据,如果你想监控设备三维运动或者位 置,或者你想监控设备周围的环境变化,是非常有用的.例 ...
- 偷懒啦!button多了,这样写既简洁又高效
在日常的项目中,我最喜欢用button了,但是button多了,写起来又枯燥又费时,今天学到一方法,绝对简单高效! 看看以前: 看吧,这还只是声明,接下来还有: 等等……,是不是很麻烦?现在找到新方法 ...
- EasyUI学习总结(三)——easyloader源码分析(转载)
声明:这一篇文章是转载过来的,转载地址忘记了,原作者如果看到了,希望能够告知一声,我好加上去! easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依 ...
- Go语言之高级篇beego框架之view
1.基本语法 go统一使用了{{ 和 }}作为左右标签,没有其它的标签符号. 如果你想要修改为其它符号,可以修改配置文件. 使用.来访问当前位置的上下文 使用$来引用当前模板根级的上下文 2.使用方法 ...
- asp.net 用JWT来实现token以此取代Session
先说一下为什么要写这一篇博客吧,其实个人有关asp.net 会话管理的了解也就一般,这里写出来主要是请大家帮我分析分析这个思路是否正确.我以前有些有关Session的也整理如下: 你的项目真的需要Se ...
- PHP ~与各加速工具的性能对比~
参与测试的加速器:Xcache,Opcache,hhvm Xcache简介 前面已经介绍了PHP加速器的原理和功用(参见LAMP架构之PHP-FPM 服务器),xcache作为目前使用广泛的PHP ...
- 一篇文章让你学透Linux系统中的more命令
Linux 下有很多实用工具可以让你在终端界面查看文本文件.其中一个就是 more. more 跟我之前另一篇文章里写到的工具 —— less 很相似.它们之间的主要不同点在于 more 只允许你向前 ...