您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹如何實現一個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類型。如此可以在遍歷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 // 獲取根節點下的子節點head106 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下的子節點script116 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 //獲取根節點下的子節點body132 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下的子節點form140 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 configFile40 * @return41 * @throws Exception42 */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 }
關于如何實現一個xml字符串通過dom4j解析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。