zoukankan      html  css  js  c++  java
  • 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

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

    例二:

     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  }
  • 相关阅读:
    密码学与安全技术
    分布式系统核心问题
    虚拟机性能监控与故障处理工具
    垃圾收集器与内存分配策略
    Channel
    Buffer
    Reactor
    I/O简介
    HashMap
    装饰者模式
  • 原文地址:https://www.cnblogs.com/ubersexual/p/3011364.html
Copyright © 2011-2022 走看看