dom4j解析xml字符串实例

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类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。

 

常用API

 

classorg.dom4j.io.SAXReader

 

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

 

interfaceorg.dom4j.Document

 

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

 

interfaceorg.dom4j.Node

 

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

 

interfaceorg.dom4j.Element

 

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

 

interfaceorg.dom4j.Attribute

 

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

 

interfaceorg.dom4j.Text

 

  • getText 获取Text节点值

 

interfaceorg.dom4j.CDATA

 

  • getText 获取CDATA Section值

 

interfaceorg.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 
 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     
 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 = "
" + "" + "" 167+ " 169+ "" + "0" + "" 170+ "1000" + "36242519880716" 171+ "" + "" + "" ; 172 173 176Map map = readStringXmlOut(xmlString); 177Iterator iters = map.keySet().iterator(); 178 while (iters.hasNext()) { 179String key = iters.next().toString(); // 拿到键 180String val = map.get(key).toString(); // 拿到值 181System.out.println(key + "=" + val); 182 } 183 } 184 185}
复制代码

  

实例二:

复制代码
 1 
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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值