1、dom4j解析 xml字符串实例 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 类型。如此
2、可以在遍历 xml 文档的时候通过常量来判断节点类型了。常用 APIclass org.dom4j.io.SAXReader read 提供多种读取 xml 文件的方式,返回一个 Domcument 对象 interface org.dom4j.Document iterator 使用此法获取 node getRootElement 获取根节点 interface org.dom4j.Node getName 获取 node 名字,例如获取根节点名称为 bookstore getNodeType 获取 node 类型常量值,例如获取到 bookstore 类型为 1Element getNod
3、eTypeName 获取 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.do
4、m4j.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.El
5、ement;10 11 /* 12 * Title: TestDom4j.java13 * Package 14 * Description: 解析 xml字符串15 * author 无处不在16 * date 2012-11-20 下午 05:14:0517 * 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就是一个管道,用一个流的方式,
6、把 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); / 将字符串转为XML32 33 Element rootElt = doc.getRootElement(); / 获取根节点34 System.out.println(“根节点:“ +
7、rootElt.getName(); / 拿到根节点的名称35 36 Iterator iter = rootElt.elementIterator(“head“); / 获取根节点下的子节点 head37 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:“ +
8、 title);44 45 Iterator iters = recordEle.elementIterator(“script“); / 获取子节点 head下的子节点script46 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 Str
9、ing 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“); /获取根节点下的子节点 body60 / 遍历 body节点61 while (iterss.hasNext() 62 63 Element recordEless = (Element)
10、 iterss.next();64 String result = recordEless.elementTextTrim(“result“); / 拿到 body节点下的子节点result值65 System.out.println(“result:“ + result);66 67 Iterator itersElIterator = recordEless.elementIterator(“form“); / 获取子节点 body下的子节点form68 / 遍历 Header节点下的 Response节点69 while (itersElIterator.hasNext() 70 71
11、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 (Documen
12、tException e) 81 e.printStackTrace();82 83 catch (Exception e) 84 e.printStackTrace();85 86 87 88 89 /*90 * description 将 xml字符串转换成 map91 * param xml92 * return Map93 */94 public static Map readStringXmlOut(String xml) 95 Map map = new HashMap();96 Document doc = null;97 try 98 / 将字符串转为 XML99 doc =
13、DocumentHelper.parseText(xml); 100 / 获取根节点101 Element rootElt = doc.getRootElement(); 102 / 拿到根节点的名称103 System.out.println(“根节点:“ + rootElt.getName(); 104 105 / 获取根节点下的子节点 head106 Iterator iter = rootElt.elementIterator(“head“); 107 / 遍历 head节点108 while (iter.hasNext() 109 110 Element recordEle = (E
14、lement) iter.next();111 / 拿到 head节点下的子节点 title值112 String title = recordEle.elementTextTrim(“title“); 113 System.out.println(“title:“ + title);114 map.put(“title“, title);115 / 获取子节点 head下的子节点 script116 Iterator iters = recordEle.elementIterator(“script“); 117 / 遍历 Header节点下的 Response节点118 while (it
15、ers.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:
16、“ + password);126 map.put(“username“, username);127 map.put(“password“, password);128 129 130 131 /获取根节点下的子节点 body132 Iterator iterss = rootElt.elementIterator(“body“); 133 / 遍历 body节点134 while (iterss.hasNext() 135 Element recordEless = (Element) iterss.next();136 / 拿到 body节点下的子节点 result值137 String
17、 result = recordEless.elementTextTrim(“result“); 138 System.out.println(“result:“ + result);139 / 获取子节点 body下的子节点 form140 Iterator itersElIterator = recordEless.elementIterator(“form“); 141 / 遍历 Header节点下的 Response节点142 while (itersElIterator.hasNext() 143 Element itemEle = (Element) itersElIterator
18、.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);
19、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 + “ + “yangrong“1
20、68 + “123456“ + “ + “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.
21、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 * DBTest12 * 13 *
22、 14 * 15 * 16 * org.gjt.mm.mysql.Driver17 * test18 * test201219 * 1020 * 1021 * 222 * 1023 * SELECT 1+124 * 25 * 26 *27 * 示例 2节点属性:28 * 29 * 30 * Everyday Italian31 * Giada De Laurentiis32 * 200533 * 30.0034 * 35 *36 * 37 * 38 *39 * param configFile40 * return41 * throws Exception42 */43 public stat
23、ic 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
24、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) /
25、 添加节点属性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