解析特殊格式的xml到map
由于项目特殊,需要解析的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的更多相关文章
- XML系列之--解析电文格式的XML(二)
上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...
- Linq解析带命名空间、前缀、Soap格式的XML
关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...
- Linq创建带命名空间、前缀、Soap格式的XML
关于XML,我也是刚接触,关于一般常见的XML,博客园.CSDN上的资料很多,对于不常见的带命名空间.前缀.Soap格式的XML的描述相对来说寥寥无几,上一篇我写到了对相对复杂的XML的读操作,下面说 ...
- XML系列之--创建电文格式的XML(一)
关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...
- XML解析与xml和Map集合的互转
1.XML的解析.首先解析XML文件我们需要先获取到文件的存放路径,获取方法有三种分别获取xml文件不同的存放路径. 代码: public class PropertiesDemo { public ...
- 【dom4j】解析xml为map
dom4j解析xml文件 <?xml version="1.0" encoding="utf-8"?> <workflows> < ...
- 解析xml报文,xml与map互转
这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader> &l ...
- Java xml和map,list格式的转换-摘抄
import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.HashMap; import j ...
- XML转换为Map通用算法实现 Java版本(Stax实现)
目前项目中需要将XML转换为Map,下面给出了自己的代码实现. 后续将为大家提供Dom版本的实现. 请各路大神给予各种优良实现. 场景: 在项目中需要解析XML文本字符串,需要将XML文本字符串映射为 ...
随机推荐
- UVA1602 Lattice Animals 搜索+剪枝
题目大意 给出一个$w\times h$的网格,定义一个连通块为一个元素个数为$n$的方格的集合$A,\forall x\in A, \exists y\in A$,使得$x,y$有一条公共边.现要求 ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
- SPOJ - QMAX3VN (4350) splay
SPOJ - QMAX3VN 一个动态的序列 ,在线询问某个区间的最大值.关于静态序列的区间最值问题,用ST表解决,参考POJ 3264 乍一看上去 splay可以轻松解决.书上说可以用块状链表解决, ...
- bzoj3907 网格 & bzoj2822 [AHOI2012]树屋阶梯——卡特兰数+高精度
题目:bzoj3907:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 bzoj2822:https://www.lydsy.com/Jud ...
- Mysql中date,time,datetime,timestamp的区别
区别: timestamp:时间戳.北京时间1970年01月01日08时00分00秒 起至现在的总秒数. datetime:带时分秒的完整时间,例如:1970-01-01 10:00:00 date: ...
- pcntl研究
虽说php用于并发计算有点山寨,但总比没有强把.(有问题请指正) 下面是pcntl多线程的例子.(只能用于cli模式,而且只能用于linux环境) <?php $starttime=microt ...
- (function(){})();和(function(){}())每个括号的用途和区别
(function(){…})(); 这种写法是因为JS中没有块级作用域的概念,所以可以用lambda函数来模仿块级作用域,这个的作用是定义并立即调用一个lambda函数,这个函数中定义的任何变量,都 ...
- [App Store Connect帮助]三、管理 App 和版本(2.4)输入 App 信息:提供加密出口合规证明文稿
上传至 App Store Connect 的 App 被上传至位于美国的 Apple 服务器.如果您提交 App 的目的是为了在 App Store 上分发您的 App 或通过美国或加拿大的境外 T ...
- Windows(7/8/10)搭建kibana 6.x版本(elasticsearch的可视化服务)
在搭建kibana之前,我们先了解下什么是kibana Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作.您可以 ...
- ACM_Repeating Characters
Repeating Characters Time Limit: 2000/1000ms (Java/Others) Problem Description: For this problem, yo ...