由于项目特殊,需要解析的xml文档样式特别,所以自己写了一个解析特殊xml的方法

先提供xml样式

<?xml version="1.0" encoding="UTF-8"?>
<root>
<head>
<head1>1</head1>
<head2>2</head2>
<head3>3</head3>
<head4>4</head4>
<head5>5</head5>
<head6>6</head6>
<head7>7</head7>
<head8>8</head8>
<head9>9</head9>
<head10>10</head10>
<head11>11</head11>
</head>
<body>
<body1>1</body1>
<body2>2</body2>
<body3>3</body3>
<body4>4</body4>
<body5>5</body5>
<body6>6</body6>
<body7>7</body7>
<details>
<detail>
<gradeitem>A</gradeitem>
<gradevalue>1</gradevalue>
</detail>
<detail>
<gradeitem>B</gradeitem>
<gradevalue>2</gradevalue>
</detail>
<detail>
<gradeitem>C</gradeitem>
<gradevalue>3</gradevalue>
</detail>
<detail>
<gradeitem>D</gradeitem>
<gradevalue>4</gradevalue>
</detail>
<detail>
<gradeitem>E</gradeitem>
<gradevalue>5</gradevalue>
</detail>
<detail>
<gradeitem>F</gradeitem>
<gradevalue>6</gradevalue>
</detail>
<detail>
<gradeitem>G</gradeitem>
<gradevalue>7</gradevalue>
</detail>
<detail>
<gradeitem>H</gradeitem>
<gradevalue>8</gradevalue>
</detail>
<detail>
<gradeitem>I</gradeitem>
<gradevalue>9</gradevalue>
</detail>
</details>
</body>
</root>

看到这个xml大家就知道哪里特殊了吧,首先head部分正常,标签名作为map的key,内容作为value;但是body中有一部分是这个规则,但另一部分是details包着的detail标签,这个<gradeitem>H</gradeitem>标签里包的值是map的key,这个<gradevalue>9</gradevalue>标签里的值是map的value;

public static Map<String, String> xmlToMap(String data) {
Map<String, String> map = new HashMap<String, String>();
ParseRatingData prd = new ParseRatingData();
Document doc;
try {
doc = DocumentHelper.parseText(data);
Element root = doc.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
return map;
}

先获取根节点是必须的了,首先我想的是把details标签内的东西解析掉,然后剩下的是一个规则,也就是要有两种方式去解析该xml

public static Map<String, String> xmlToMap(String data) {
Map<String, String> map = new HashMap<String, String>();
ParseRatingData prd = new ParseRatingData();
Document doc;
try {
doc = DocumentHelper.parseText(data);
Element root = doc.getRootElement();
// 解析head
Element head = root.element("head");
map.putAll(prd.nodeToMap(head,"head",map));
// 解析body
Element body = root.element("body");
map.putAll(prd.nodeToMap(body,"body",map));
// 解析details
Element details = body.element("details");
List<Element> detailList = details.elements("detail");
for (Element detail : detailList) {
map.put(detail.elementText("gradeitem"), detail.elementText("gradevalue"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
return map;
}

这是刚才那个方法的全部代码,解析details部分就是先获取到details下的所有detail,放在一个list集合中,然后分别取得不同标签下的value值作为map的key和value

细心的同学已经发现nodeToMap(Element ele,String str,Map map)这个方法了吧,下面看看这个方法都写了啥

public Map<String, String> nodeToMap(Element node,String str,Map<String, String> map){
if(!str.equals(node.getName())){
if("details".equals(node.getName())){
return map;
}
map.put(node.getName(), node.getTextTrim());//当前节点名称,当前节点内容
}
//递归遍历当前节点所有的子节点
List<Element> listElement=node.elements();//所有一级子节点的list
for(Element e:listElement){//遍历所有一级子节点
nodeToMap(e,"",map);//递归
}
return map;
}

这个就是另外一种普通的解析方式,利用递归的方式遍历传入的node参数下的所有的子节点,然后将该节点的标签名作为map的key,值作为map的value

需要注意的一点就是为了方便,我将参数中加的str实际就是传入node参数的String格式,如果相同,则为父节点,不往map中放,不同的时候表示为子节点才会放在map中

如果出现details节点,说明body遍历到这儿就拉倒了,接下来是details遍历需要处理的东西,直接return出去就好,这里传入map参数是为了直接在原来的map的基础上直接添加数据。

解析完毕,大神们有什么意见看法请不吝赐教啊~

欢迎转载,转载请注明出处

Java从入门到放弃,MySQL从删库到跑路~~~

解析特殊格式的xml到map的更多相关文章

  1. XML系列之--解析电文格式的XML(二)

    上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...

  2. Linq解析带命名空间、前缀、Soap格式的XML

    关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...

  3. Linq创建带命名空间、前缀、Soap格式的XML

    关于XML,我也是刚接触,关于一般常见的XML,博客园.CSDN上的资料很多,对于不常见的带命名空间.前缀.Soap格式的XML的描述相对来说寥寥无几,上一篇我写到了对相对复杂的XML的读操作,下面说 ...

  4. XML系列之--创建电文格式的XML(一)

    关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...

  5. XML解析与xml和Map集合的互转

    1.XML的解析.首先解析XML文件我们需要先获取到文件的存放路径,获取方法有三种分别获取xml文件不同的存放路径. 代码: public class PropertiesDemo { public ...

  6. 【dom4j】解析xml为map

    dom4j解析xml文件 <?xml version="1.0" encoding="utf-8"?> <workflows> < ...

  7. 解析xml报文,xml与map互转

    这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader> &l ...

  8. Java xml和map,list格式的转换-摘抄

    import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.HashMap; import j ...

  9. XML转换为Map通用算法实现 Java版本(Stax实现)

    目前项目中需要将XML转换为Map,下面给出了自己的代码实现. 后续将为大家提供Dom版本的实现. 请各路大神给予各种优良实现. 场景: 在项目中需要解析XML文本字符串,需要将XML文本字符串映射为 ...

随机推荐

  1. Android 使用MediaRecorder录音调用stop()方法的时候报错【转】

    本文转载自:http://blog.csdn.net/u014737138/article/details/49738827 这个问题在网上看到了太多的答案,一直提示说按照官网的api的顺序来,其实解 ...

  2. 排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

    #include <stdio.h> #include <math.h> // 算法竞赛的目标是编程对任意输入均得到正确的结果. // 请先独立完成,如果有困难可以翻阅本书代码 ...

  3. git 命令 —— checkout

    git checkout 会重写工作区.check in 常常表示酒店入住,则 check out 就表示结账(检查)离开. 1. 基本用法 Git学习笔记04–git checkout git ch ...

  4. bzoj1407

    扩展欧几里得 我们发现其实就是两个野人在自己的寿命内不会相遇,或者永远不会相遇,那么我们枚举m,然后枚举两个人,看是否符合条件 扩展欧几里得ax+by=c,这里c不能取模,a能取模,具体不想了 #in ...

  5. Webservice 的安全策略

      摘自:http://www.cnblogs.com/shengel/archive/2008/11/20/1337723.html   Webservice为作为方便的服务被用广大领域使用的同时, ...

  6. ubuntu16.04更改源

    最近用apt-get安装软件总是提示列表无法全部更新,导致一些软件安装不上,下面我们通过讲/etc/apt/sources.list里为阿里源,实现访问. 第一步: 备份/etc/apt/source ...

  7. join()和fromkeys()的用法与注意事项

    join()和fromkeys()的用法与注意事项 1.join()的用法与注意事项: join()可以使用集合,列表,字符串的子元素,拼接,下面介绍用法: str.join(data) 2.from ...

  8. Java初级面试模拟1

    1.简单介绍一下你的项目,说一下项目有什么模块 2.说说常见的集合有哪些吧 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List ...

  9. python值函数名的使用以及闭包,迭代器

    一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func(): print("我是一个小小的函数") a = fun ...

  10. 学习c语言的感想

    其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以,C语言的重要性不言而喻. 一.课本 无论用的是什么书,要学好C语言,把书上的每一个例题.习题的代码读 ...