dom4j解析xml字符串实例

DOM4J

与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。

先来看看dom4j中对应XML的DOM树建立的继承关系

dom4j解析xml字符串实例

针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:

dom4j解析xml字符串实例

同时,dom4j的NodeType枚举实现了XML规范中定义的node类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。

常用API

class org.dom4j.io.SAXReader

  • read 提供多种读取xml文件的方式,返回一个Domcument对象

interface org.dom4j.Document

  • iterator 使用此法获取node
  • getRootElement 获取根节点

interface org.dom4j.Node

  • getName 获取node名字,例如获取根节点名称为bookstore
  • getNodeType 获取node类型常量值,例如获取到bookstore类型为1——Element
  • getNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Element

interface org.dom4j.Element

  • attributes 返回该元素的属性列表
  • attributeValue 根据传入的属性名获取属性值
  • elementIterator 返回包含子元素的迭代器
  • elements 返回包含子元素的列表

interface org.dom4j.Attribute

  • getName 获取属性名
  • getValue 获取属性值

interface org.dom4j.Text

  • getText 获取Text节点值

interface org.dom4j.CDATA

  • getText 获取CDATA Section值

interface org.dom4j.Comment

  • getText 获取注释

实例一:

  1 //先加入dom4j.jar包
  2 import java.util.HashMap;
  3 import java.util.Iterator;
  4 import java.util.Map;
  5
  6 import org.dom4j.Document;
  7 import org.dom4j.DocumentException;
  8 import org.dom4j.DocumentHelper;
  9 import org.dom4j.Element;
 10
 11 /**
 12 * @Title: TestDom4j.java
 13 * @Package
 14 * @Description: 解析xml字符串
 15 * @author 无处不在
 16 * @date 2012-11-20 下午05:14:05
 17 * @version V1.0
 18 */
 19 public class TestDom4j {
 20
 21     public void readStringXml(String xml) {
 22         Document doc = null;
 23         try {
 24
 25             // 读取并解析XML文档
 26             // SAXReader就是一个管道,用一个流的方式,把xml文件读出来
 27             //
 28             // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档
 29             // Document document = reader.read(new File("User.hbm.xml"));
 30             // 下面的是通过解析xml字符串的
 31             doc = DocumentHelper.parseText(xml); // 将字符串转为XML
 32
 33             Element rootElt = doc.getRootElement(); // 获取根节点
 34             System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
 35
 36             Iterator iter = rootElt.elementIterator("head"); // 获取根节点下的子节点head
 37
 38             // 遍历head节点
 39             while (iter.hasNext()) {
 40
 41                 Element recordEle = (Element) iter.next();
 42                 String title = recordEle.elementTextTrim("title"); // 拿到head节点下的子节点title值
 43                 System.out.println("title:" + title);
 44
 45                 Iterator iters = recordEle.elementIterator("script"); // 获取子节点head下的子节点script
 46
 47                 // 遍历Header节点下的Response节点
 48                 while (iters.hasNext()) {
 49
 50                     Element itemEle = (Element) iters.next();
 51
 52                     String username = itemEle.elementTextTrim("username"); // 拿到head下的子节点script下的字节点username的值
 53                     String password = itemEle.elementTextTrim("password");
 54
 55                     System.out.println("username:" + username);
 56                     System.out.println("password:" + password);
 57                 }
 58             }
 59             Iterator iterss = rootElt.elementIterator("body"); ///获取根节点下的子节点body
 60             // 遍历body节点
 61             while (iterss.hasNext()) {
 62
 63                 Element recordEless = (Element) iterss.next();
 64                 String result = recordEless.elementTextTrim("result"); // 拿到body节点下的子节点result值
 65                 System.out.println("result:" + result);
 66
 67                 Iterator itersElIterator = recordEless.elementIterator("form"); // 获取子节点body下的子节点form
 68                 // 遍历Header节点下的Response节点
 69                 while (itersElIterator.hasNext()) {
 70
 71                     Element itemEle = (Element) itersElIterator.next();
 72
 73                     String banlce = itemEle.elementTextTrim("banlce"); // 拿到body下的子节点form下的字节点banlce的值
 74                     String subID = itemEle.elementTextTrim("subID");
 75
 76                     System.out.println("banlce:" + banlce);
 77                     System.out.println("subID:" + subID);
 78                 }
 79             }
 80         } catch (DocumentException e) {
 81             e.printStackTrace();
 82
 83         } catch (Exception e) {
 84             e.printStackTrace();
 85
 86         }
 87     }
 88
 89     /**
 90      * @description 将xml字符串转换成map
 91      * @param xml
 92      * @return Map
 93      */
 94     public static Map readStringXmlOut(String xml) {
 95         Map map = new HashMap();
 96         Document doc = null;
 97         try {
 98             // 将字符串转为XML
 99             doc = DocumentHelper.parseText(xml);
100             // 获取根节点
101             Element rootElt = doc.getRootElement();
102             // 拿到根节点的名称
103             System.out.println("根节点:" + rootElt.getName());
104
105             // 获取根节点下的子节点head
106             Iterator iter = rootElt.elementIterator("head");
107             // 遍历head节点
108             while (iter.hasNext()) {
109
110                 Element recordEle = (Element) iter.next();
111                 // 拿到head节点下的子节点title值
112                 String title = recordEle.elementTextTrim("title");
113                 System.out.println("title:" + title);
114                 map.put("title", title);
115                 // 获取子节点head下的子节点script
116                 Iterator iters = recordEle.elementIterator("script");
117                 // 遍历Header节点下的Response节点
118                 while (iters.hasNext()) {
119                     Element itemEle = (Element) iters.next();
120                     // 拿到head下的子节点script下的字节点username的值
121                     String username = itemEle.elementTextTrim("username");
122                     String password = itemEle.elementTextTrim("password");
123
124                     System.out.println("username:" + username);
125                     System.out.println("password:" + password);
126                     map.put("username", username);
127                     map.put("password", password);
128                 }
129             }
130
131             //获取根节点下的子节点body
132             Iterator iterss = rootElt.elementIterator("body");
133             // 遍历body节点
134             while (iterss.hasNext()) {
135                 Element recordEless = (Element) iterss.next();
136                 // 拿到body节点下的子节点result值
137                 String result = recordEless.elementTextTrim("result");
138                 System.out.println("result:" + result);
139                 // 获取子节点body下的子节点form
140                 Iterator itersElIterator = recordEless.elementIterator("form");
141                 // 遍历Header节点下的Response节点
142                 while (itersElIterator.hasNext()) {
143                     Element itemEle = (Element) itersElIterator.next();
144                     // 拿到body下的子节点form下的字节点banlce的值
145                     String banlce = itemEle.elementTextTrim("banlce");
146                     String subID = itemEle.elementTextTrim("subID");
147
148                     System.out.println("banlce:" + banlce);
149                     System.out.println("subID:" + subID);
150                     map.put("result", result);
151                     map.put("banlce", banlce);
152                     map.put("subID", subID);
153                 }
154             }
155         } catch (DocumentException e) {
156             e.printStackTrace();
157         } catch (Exception e) {
158             e.printStackTrace();
159         }
160         return map;
161     }
162
163     public static void main(String[] args) {
164
165         // 下面是需要解析的xml字符串例子
166         String xmlString = "" + "" + "dom4j解析一个例子"
167                 + "" + ""
169                 + "" + "0" + "
" 170 + "1000" + "36242519880716" 171 + "
" + "" + ""; 172 173 /* 174 * Test2 test = new Test2(); test.readStringXml(xmlString); 175 */ 176 Map map = readStringXmlOut(xmlString); 177 Iterator iters = map.keySet().iterator(); 178 while (iters.hasNext()) { 179 String key = iters.next().toString(); // 拿到键 180 String val = map.get(key).toString(); // 拿到值 181 System.out.println(key + "=" + val); 182 } 183 } 184 185 }

实例二:

1 /**
 2  * 解析包含有DB连接信息的XML文件
 3  * 格式必须符合如下规范:
 4  * 1. 最多三级,每级的node名称自定义;
 5  * 2. 二级节点支持节点属性,属性将被视作子节点;
 6  * 3. CDATA必须包含在节点中,不能单独出现。
 7  *
 8  * 示例1——三级显示:
 9  *
10  *
11  *            DBTest
12  *
13  *
14  *
15  *
16  *            org.gjt.mm.mysql.Driver
17  *             test
18  *            test2012
19  *            10
20  *            10
21  *            2
22  *            10
23  *            SELECT 1+1
24  *
25  *
26  *
27  * 示例2——节点属性:
28  *
29  *
30  *            Everyday Italian
31  *            Giada De Laurentiis
32  *            2005
33  *            30.00
34  *
35  *
36  *
37  *
38  *
39  * @param configFile
40  * @return
41  * @throws Exception
42  */
43 public static List> parseDBXML(String configFile) throws Exception {
44     List> dbConnections = new ArrayList>();
45     InputStream is = Parser.class.getResourceAsStream(configFile);
46     SAXReader saxReader = new SAXReader();
47     Document document = saxReader.read(is);
48     Element connections = document.getRootElement();
49
50     Iterator rootIter = connections.elementIterator();
51     while (rootIter.hasNext()) {
52         Element connection = rootIter.next();
53         Iterator childIter = connection.elementIterator();
54         Map connectionInfo = new HashMap();
55         List attributes = connection.attributes();
56         for (int i = 0; i < attributes.size(); ++i) { // 添加节点属性
57             connectionInfo.put(attributes.get(i).getName(), attributes.get(i).getValue());
58         }
59         while (childIter.hasNext()) { // 添加子节点
60             Element attr = childIter.next();
61             connectionInfo.put(attr.getName().trim(), attr.getText().trim());
62         }
63         dbConnections.add(connectionInfo);
64     }
65
66     return dbConnections;
67 }

Original: https://www.cnblogs.com/goody9807/p/7522157.html
Author: PointNet
Title: dom4j解析xml字符串实例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/551826/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Activiti7多实例子流程

    顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。 使用子流程确实有一些限制: 一个子流程只能有一个none类型的启动事…

    技术杂谈 2023年7月24日
    095
  • C# GDI+绘图 z

    一、坐标系 坐标系是图形设计的基础。GDI+使用三个坐标空间:世界、页面和设备,其中,世界坐标是用于建立特殊图形世界模型的坐标系,也是在.NET Framework中传递给方法的坐…

    技术杂谈 2023年6月1日
    0111
  • Redis和Mysql保持数据一致性

    1、简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数…

    技术杂谈 2023年6月21日
    097
  • mybatis报错:java.io.IOException: Could not find resource /resources/mybatis-config.xml

    原因:这个图标的resources目录是根目录,在此目录下的文件直接写文件名即可 Original: https://www.cnblogs.com/CounterX/p/1645…

    技术杂谈 2023年7月24日
    084
  • pip常用命令

    pip常用命令: bundle&#xFF0C;&#x521B;&#x5EFA;&#x5305;&#x542B;&#x591A;&am…

    技术杂谈 2023年7月11日
    077
  • JavaScript学习

    一、什么是JavaScript JavaScript世界上最流行的脚本语言 一个合格的后端人员,必须精通JavaScript 二、快速入门 2.1、引入JavaScript 内部引…

    技术杂谈 2023年6月21日
    0129
  • 软件测试基础理论

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    技术杂谈 2023年7月25日
    090
  • GPS北斗NTP授时服务器助力数字化校园网络建设

    GPS北斗NTP授时服务器助力数字化校园网络建设 GPS北斗NTP授时服务器助力数字化校园网络建设 京准电子科技官微——ahjzsz 随着网络的普及,许多单位都建了自己的园区网,使…

    技术杂谈 2023年6月21日
    089
  • 王阳明心学语录

    1 处朋友,务相下则得益,相上则损 译文:同朋友相处,一定要相互谦让,就会获得好处,而相互攀比互争高低,则只会受损。 2 曾国藩 :败人两物,非傲即惰 3 曾子曰:”吾…

    技术杂谈 2023年5月31日
    093
  • conditions条件判断

    conditions可以根据条件绑定样式或者数据 type ==、!=、 left 条件左值 right 条件右值 executionType 条件执行类型,支持 0 和 1 两个…

    技术杂谈 2023年6月1日
    0139
  • GO sync.WaitGroup

    执行完所有子函数后退出主程序 1. 串行执行 执行: 问题:性能慢 2. 并发执行 执行: 问题:主程序到底sleep多杀,还得自己控制,无法智能控制 3. 并发执行 执行: sy…

    技术杂谈 2023年5月31日
    098
  • [转]winscp以命令行方式同步服务器数据到PC机磁盘上

    博客地址:http://www.cnblogs.com/wolf-sun/ 博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐…

    技术杂谈 2023年6月1日
    0112
  • 记一次 Windows 下 Python 3 的控制台虚拟终端序列(控制台颜色输出, colorama 库)的踩坑经历

    修改 2022.7.31 感谢 @DavyZhou 的评论,对文章进行了一次大修改。 2022.8.2 又踩了一次坑,再补充一下 前言 本人的电脑配置为 Windows 11 , …

    技术杂谈 2023年7月25日
    0104
  • Devops相关考试和认证

    Devops相关考试和认证 Red Hat Certified System Administrator (RHCSA) 能够执行以下任务: 了解和运用必要的工具来处理文件、目录、…

    技术杂谈 2023年5月31日
    0108
  • 从问题域和解决域看需求评审

    01、 什么是需求评审? 需求是用户在产品使用过程中,发现产品存在无法满足的业务场景或无法解决的业务问题,进而提出的诉求。 需求评审可以区分为两个维度,一个是评审需求的问题域,即该…

    技术杂谈 2023年7月23日
    0104
  • 面试被问怎么排查平时遇到的系统CPU飙高和频繁GC,该怎么回答?

    对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种…

    技术杂谈 2023年5月31日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球