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

先提供xml样式

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <head>
  4. <head1>1</head1>
  5. <head2>2</head2>
  6. <head3>3</head3>
  7. <head4>4</head4>
  8. <head5>5</head5>
  9. <head6>6</head6>
  10. <head7>7</head7>
  11. <head8>8</head8>
  12. <head9>9</head9>
  13. <head10>10</head10>
  14. <head11>11</head11>
  15. </head>
  16. <body>
  17. <body1>1</body1>
  18. <body2>2</body2>
  19. <body3>3</body3>
  20. <body4>4</body4>
  21. <body5>5</body5>
  22. <body6>6</body6>
  23. <body7>7</body7>
  24. <details>
  25. <detail>
  26. <gradeitem>A</gradeitem>
  27. <gradevalue>1</gradevalue>
  28. </detail>
  29. <detail>
  30. <gradeitem>B</gradeitem>
  31. <gradevalue>2</gradevalue>
  32. </detail>
  33. <detail>
  34. <gradeitem>C</gradeitem>
  35. <gradevalue>3</gradevalue>
  36. </detail>
  37. <detail>
  38. <gradeitem>D</gradeitem>
  39. <gradevalue>4</gradevalue>
  40. </detail>
  41. <detail>
  42. <gradeitem>E</gradeitem>
  43. <gradevalue>5</gradevalue>
  44. </detail>
  45. <detail>
  46. <gradeitem>F</gradeitem>
  47. <gradevalue>6</gradevalue>
  48. </detail>
  49. <detail>
  50. <gradeitem>G</gradeitem>
  51. <gradevalue>7</gradevalue>
  52. </detail>
  53. <detail>
  54. <gradeitem>H</gradeitem>
  55. <gradevalue>8</gradevalue>
  56. </detail>
  57. <detail>
  58. <gradeitem>I</gradeitem>
  59. <gradevalue>9</gradevalue>
  60. </detail>
  61. </details>
  62. </body>
  63. </root>

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

  1. public static Map<String, String> xmlToMap(String data) {
  2. Map<String, String> map = new HashMap<String, String>();
  3. ParseRatingData prd = new ParseRatingData();
  4. Document doc;
  5. try {
  6. doc = DocumentHelper.parseText(data);
  7. Element root = doc.getRootElement();
  8. } catch (DocumentException e) {
  9. e.printStackTrace();
  10. }
  11. return map;
  12. }

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

  1. public static Map<String, String> xmlToMap(String data) {
  2. Map<String, String> map = new HashMap<String, String>();
  3. ParseRatingData prd = new ParseRatingData();
  4. Document doc;
  5. try {
  6. doc = DocumentHelper.parseText(data);
  7. Element root = doc.getRootElement();
  8. // 解析head
  9. Element head = root.element("head");
  10. map.putAll(prd.nodeToMap(head,"head",map));
  11. // 解析body
  12. Element body = root.element("body");
  13. map.putAll(prd.nodeToMap(body,"body",map));
  14. // 解析details
  15. Element details = body.element("details");
  16. List<Element> detailList = details.elements("detail");
  17. for (Element detail : detailList) {
  18. map.put(detail.elementText("gradeitem"), detail.elementText("gradevalue"));
  19. }
  20. } catch (DocumentException e) {
  21. e.printStackTrace();
  22. }
  23. return map;
  24. }

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

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

  1. public Map<String, String> nodeToMap(Element node,String str,Map<String, String> map){
  2. if(!str.equals(node.getName())){
  3. if("details".equals(node.getName())){
  4. return map;
  5. }
  6. map.put(node.getName(), node.getTextTrim());//当前节点名称,当前节点内容
  7. }
  8. //递归遍历当前节点所有的子节点
  9. List<Element> listElement=node.elements();//所有一级子节点的list
  10. for(Element e:listElement){//遍历所有一级子节点
  11. nodeToMap(e,"",map);//递归
  12. }
  13. return map;
  14. }

这个就是另外一种普通的解析方式,利用递归的方式遍历传入的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. UVA1602 Lattice Animals 搜索+剪枝

    题目大意 给出一个$w\times h$的网格,定义一个连通块为一个元素个数为$n$的方格的集合$A,\forall x\in A, \exists y\in A$,使得$x,y$有一条公共边.现要求 ...

  2. P2657 [SCOI2009]windy数 数位dp

    数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...

  3. SPOJ - QMAX3VN (4350) splay

    SPOJ - QMAX3VN 一个动态的序列 ,在线询问某个区间的最大值.关于静态序列的区间最值问题,用ST表解决,参考POJ 3264 乍一看上去 splay可以轻松解决.书上说可以用块状链表解决, ...

  4. bzoj3907 网格 & bzoj2822 [AHOI2012]树屋阶梯——卡特兰数+高精度

    题目:bzoj3907:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 bzoj2822:https://www.lydsy.com/Jud ...

  5. Mysql中date,time,datetime,timestamp的区别

    区别: timestamp:时间戳.北京时间1970年01月01日08时00分00秒 起至现在的总秒数. datetime:带时分秒的完整时间,例如:1970-01-01 10:00:00 date: ...

  6. pcntl研究

    虽说php用于并发计算有点山寨,但总比没有强把.(有问题请指正) 下面是pcntl多线程的例子.(只能用于cli模式,而且只能用于linux环境) <?php $starttime=microt ...

  7. (function(){})();和(function(){}())每个括号的用途和区别

    (function(){…})(); 这种写法是因为JS中没有块级作用域的概念,所以可以用lambda函数来模仿块级作用域,这个的作用是定义并立即调用一个lambda函数,这个函数中定义的任何变量,都 ...

  8. [App Store Connect帮助]三、管理 App 和版本(2.4)输入 App 信息:提供加密出口合规证明文稿

    上传至 App Store Connect 的 App 被上传至位于美国的 Apple 服务器.如果您提交 App 的目的是为了在 App Store 上分发您的 App 或通过美国或加拿大的境外 T ...

  9. Windows(7/8/10)搭建kibana 6.x版本(elasticsearch的可视化服务)

    在搭建kibana之前,我们先了解下什么是kibana Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作.您可以 ...

  10. ACM_Repeating Characters

    Repeating Characters Time Limit: 2000/1000ms (Java/Others) Problem Description: For this problem, yo ...