DOM4J

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

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

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

同时,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 = "<html>" + "<head>" + "<title>dom4j解析一个例子</title>"
167 + "<script>" + "<username>yangrong</username>"
168 + "<password>123456</password>" + "</script>" + "</head>"
169 + "<body>" + "<result>0</result>" + "<form>"
170 + "<banlce>1000</banlce>" + "<subID>36242519880716</subID>"
171 + "</form>" + "</body>" + "</html>";
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 * <db-connections>
10 * <connection>
11 * <name>DBTest</name>
12 * <jndi></jndi>
13 * <url>
14 * <![CDATA[jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=UTF8]]>
15 * </url>
16 * <driver>org.gjt.mm.mysql.Driver</driver>
17 * <user>test</user>
18 * <password>test2012</password>
19 * <max-active>10</max-active>
20 * <max-idle>10</max-idle>
21 * <min-idle>2</min-idle>
22 * <max-wait>10</max-wait>
23 * <validation-query>SELECT 1+1</validation-query>
24 * </connection>
25 * </db-connections>
26 *
27 * 示例2——节点属性:
28 * <bookstore>
29 * <book category="cooking">
30 * <title lang="en">Everyday Italian</title>
31 * <author>Giada De Laurentiis</author>
32 * <year>2005</year>
33 * <price>30.00</price>
34 * </book>
35 *
36 * <book category="children" title="Harry Potter" author="J K. Rowling" year="2005" price="$29.9"/>
37 * </bookstore>
38 *
39 * @param configFile
40 * @return
41 * @throws Exception
42 */
43 public static List<Map<String, String>> parseDBXML(String configFile) throws Exception {
44 List<Map<String, String>> dbConnections = new ArrayList<Map<String, String>>();
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<Element> rootIter = connections.elementIterator();
51 while (rootIter.hasNext()) {
52 Element connection = rootIter.next();
53 Iterator<Element> childIter = connection.elementIterator();
54 Map<String, String> connectionInfo = new HashMap<String, String>();
55 List<Attribute> 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 }

dom4j解析xml字符串实例的更多相关文章

  1. java中使用axis发布和调用webService及dom4j解析xml字符串

    工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService. 需要的jar包: webService服务端: import javax.jws.WebMetho ...

  2. dom4j解析xml字符串

    import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Docume ...

  3. java解析xml字符串(用dom4j)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  4. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  5. dom4j解析xml文件和字符串

    转自:http://www.cnblogs.com/black-spike/p/9776180.html 最近在工作中,需要调别的接口,接口返回的是一个字符串,而且内容是xml格式的,结果在解析jso ...

  6. java dom4j解析xml实例(2)

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  7. java dom4j解析xml实例

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  8. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  9. dom4j解析xml文档全面介绍

    一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...

随机推荐

  1. Visio制图之垮职能流程图

    Visio制图中常用的一种就是带有不同职能,不同阶段的流程关系图. 下面是根据实际生产情况制作的一张“软件生产流程关系图”,供参考.

  2. cactiEZ 配置

    CactiEZ 中文版是简单有效的cacti中文解决方案,它基于centos6 整合了cacti的相关软件,重新编译的一个新的操作系统 它基于centos6,启动速度快,支持EXT4文件系统,全中文页 ...

  3. tensorflow基础架构 - 处理结构+创建一个线性回归模型+session+Variable+Placeholder

    以下仅为自己的整理记录,绝大部分参考来源:莫烦Python,建议去看原博客 一.处理结构 因为TensorFlow是采用数据流图(data flow graphs)来计算, 所以首先我们得创建一个数据 ...

  4. hive参数配置及任务优化

    一.hive常用参数 0.常用参数 --@Name: --@Description: --@Type:全量加载 --@Author:--- --@CreateDate: --@Target: --@S ...

  5. spring boot整合servlet、filter、Listener等组件方式

    创建一个maven项目,然后此项目继承一个父项目:org.springframework.boot 1.创建一个maven项目: 2.点击next后配置父项目及版本号 3.点击finish后就可查看p ...

  6. JavaScript函数、闭包、原型、面向对象

    JavaScript函数.闭包.原型.面向对象 断言 单元测试框架的核心是断言方法,通常叫assert(). 该方法通常接收一个值--需要断言的值,以及一个表示该断言目的的描述. 如果该值执行的结果为 ...

  7. python request 库

    快速上手 迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: Requests 已安装 Req ...

  8. Alpha(2/10)

    鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...

  9. 动画库NineOldAndroids

    动画库NineOldAndroids   NineOldAndroids组件是一个向下兼容的动画库,主要是使低于API 11的系统也能够使用View的属性动画.该动画库支持旋转.移动.透明渐变.缩放等 ...

  10. UVA 277 Puzzle

    题意:输入5x5的字符串,输入操作,要求输出完成操作后的字符串. 注意:①输入的操作执行可能会越界,如果越界则按题目要求输出不能完成的语句. ②除了最后一次的输出外,其他输出均要在后面空一行. ③操作 ...