Java 处理 XML 的三种主流技术及介绍-2

上一篇 / 下一篇  2012-08-16 13:42:10 / 个人分类:Java

IQ$rg(P-g7hN0  在上面的例子中,DOMParser 的 Parse() 方法负责解析 XML 文件并生成对应的 DOM Document 对象。其中 DocumentBuilderFactory 用于生成 DOM 文档解析器以便解析 XML 文档。 在获取了 XML 文件对应的 Document 对象之后,我们可以调用一系列的 API 方便的对文档对象模型中的元素进行访问和处理。 需要注意的是调用 Element 对象的 getChildNodes() 方法时将返回其下所有的子节点,其中包括空白节点,因此需要在处理子 Element 之前对节点类型加以判断。51Testing软件测试网g:mxq Z,C6BR

"m Z4QuwS6u ? E h0  可以看出 DOM 解析 XML 易于开发,只需要通过解析器建立起 XML 对应的 DOM 树型结构后便可以方便的使用 API 对节点进行访问和处理,支持节点的删除和修改等。 但是 DOM 解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中,因此不适合用 DOM 解析很大的 XML 文件。

{g9T8Jk? ? e0

Rx#Q(l_] F%ch R(F0  SAX 解析 XML

Vy.A^nw5A^D_051Testing软件测试网s)T;QT/B3][,?7X

  与 DOM 建立树形结构的方式不同,SAX 采用事件模型来解析 XML 文档,是解析 XML 文档的一种更快速、更轻量的方法。 利用 SAX 可以对 XML 文档进行有选择的解析和访问,而不必像 DOM 那样加载整个文档,因此它对内存的要求较低。 但 SAX 对 XML 文档的解析为一次性读取,不创建任何文档对象,很难同时访问文档中的多处数据。

0IG Z_(^1Z0

t&`3B*oo]L0  下面是一个 SAX 解析 XML 的例子:51Testing软件测试网+u bQ!hK8N!j5H^w{6EsI

Hqk6MS)I2g"u0

;^eaDk'Z^.I0
  1. import org.xml.sax.Attributes;   
  2. import org.xml.sax.SAXException;   
  3. import org.xml.sax.XMLReader;   
  4. import org.xml.sax.helpers.DefaultHandler;   
  5. import org.xml.sax.helpers.XMLReaderFactory;   
  6.  
  7. public class SAXParser {   
  8.  
  9.   class BookHandler extends DefaultHandler {   
  10.      private List<String> nameList;   
  11.      private boolean title = false;   
  12.     
  13.      public List<String> getNameList() {   
  14.         return nameList;   
  15.      }   
  16.      // Called at start of an XML document  
  17.      @Override   
  18.      public void startDocument() throws SAXException {   
  19.         System.out.println("Start parsing document...");   
  20.         nameList = new ArrayList<String>();   
  21.      }   
  22.      // Called at end of an XML document  
  23.      @Override   
  24.      public void endDocument() throws SAXException {    
  25.         System.out.println("End");    
  26.      }   
  27.        
  28.      /**  
  29.       * Start processing of an element.  
  30.       * @param namespaceURI  Namespace URI  
  31.       * @param localName  The local name, without prefix  
  32.       * @param qName  The qualified name, with prefix  
  33.       * @param atts  The attributes of the element  
  34.       */   
  35.      @Override   
  36.      public void startElement(String uri, String localName, String qName,   
  37.      Attributes atts) throws SAXException {   
  38.         // Using qualified name because we are not using xmlns prefixes here.  
  39.         if (qName.equals("title")) {   
  40.            title = true;   
  41.         }   
  42.      }   
  43.     
  44.      @Override   
  45.      public void endElement(String namespaceURI, String localName, String qName)   
  46.         throws SAXException {   
  47.         // End of processing current element  
  48.         if (title) {   
  49.            title = false;   
  50.         }   
  51.      }   
  52.               
  53.      @Override   
  54.      public void characters(char[] ch, int start, int length) {   
  55.         // Processing character data inside an element  
  56.         if (title) {   
  57.            String bookTitle = new String(ch, start, length);   
  58.            System.out.println("Book title: " + bookTitle);   
  59.            nameList.add(bookTitle);   
  60.         }   
  61.      }   
  62.           
  63.   }   
  64.  
  65.   public static void main(String[] args) throws SAXException, IOException {   
  66.      XMLReader parser = XMLReaderFactory.createXMLReader();   
  67.      BookHandler bookHandler = (new SAXParser()).new BookHandler();   
  68.      parser.setContentHandler(bookHandler);   
  69.      parser.parse("books.xml");   
  70.      System.out.println(bookHandler.getNameList());   
  71.   }   
  72. }
  73. 51Testing软件测试网F"D#I5QZM

      SAX 解析器接口和事件处理器接口定义在 org.xml.sax 包中。主要的接口包括 ContentHandler、DTDHandler、EntityResolver 及 ErrorHandler。 其中 ContentHandler 是主要的处理器接口,用于处理基本的文档解析事件;DTDHandler 和 EntityResolver 接口用于处理与 DTD 验证和实体解析相关的事件; ErrorHandler 是基本的错误处理接口。DefaultHandler 类实现了上述四个事件处理接口。上面的例子中 BookHandler 继承了 DefaultHandler 类, 并覆盖了其中的五个回调方法 startDocument()、endDocument()、startElement()、endElement() 及 characters() 以加入自己的事件处理逻辑。51Testing软件测试网u w}+R)Bp/s

    Bc px0y0  Digester 解析 XML

    ;z:cF3H1h1Vi z5D-c0

    8FP|5wI\(Y5m0  为了满足将 XML 转换为 JavaBean 的特殊需求,Apache 旗下的一个名为 Digester 的工具为我们提供了这么一个选择。由于最终是将 XML 转化为 JavaBean 存储在内存当中, 故而解析性能等方面其实与使用者并没有多大关系。解析的关键在于用以匹配 XML 的模式以及规则等,由于该工具较为复杂,限于篇幅,作者只能给予简单的介绍。51Testing软件测试网R4}N7K^l

    vB:eAA]Lj XF0_0  下面是一个 Digester 解析 XML 的例子片段:51Testing软件测试网8kn[0Et P:otc

    $|m}%JDJ#~&Cd0

    DeTAn*q9C {0
    1. // 定义要解析的 XML 的路径,并初始化工具类 
    2. File input = new File("books.xml");   
    3. Digester digester = new Digester();   
    4.  
    5. // 如果碰到了 <books> 这个标签,应该初始化 test.myBean.Books 这个 JavaBean 并填装相关内容 
    6. digester.addObjectCreate("books""test.myBean.Books");   
    7. digester.addSetProperties("books");   
    8. // 如果碰到了 <books/book> 这个标签,同上初始化 test.myBean.Book 这个 JavaBean  
    9. digester.addObjectCreate("books/book""test.myBean.Book");   
    10. digester.addSetProperties("books/book");   
    11. // 通过调用上面已经初始化过的 JavaBean 的 addBook() 方法来把多个 <books/book> 加到一个集合中 
    12. digester.addSetNext("books/book""addBook""test.myBean.Book");   
    13.  
    14. // 定义好了上面的解析规则后,就可以开始进行解析工作 
    15. Books books = (Books) digester.parse(input);

    %MlT @K6qOl0  上述代码简单的向读者展示了 Digester 处理 XML 的一些要点,主要是说明了一些模式以及规则的匹配。 简言之,Digester 就是一种用来把一个 XML 转化为一个与该 XML 结构类似的 JavaBean。你可以把 XML 根元素想象成一个 JavaBean, 该根元素的 attribute 就是这个 JavaBean 的各种 Field,当该根元素有其他子 tag 时,又要把这个子 tag 想象成一个个新的 XML,将其视为一个新的 JavaBean, 并作为一个 Field 加入到父 Bean 当中,然后以此类推,通过循环的方式将整个 XML 进行解析。

    Mv^`:O;B051Testing软件测试网*m+U a}:[7AW M

      结束语51Testing软件测试网;ei Ks7[n.W

    *|;E)X0h(^0  本文介绍了 Java 解析 XML 的三种常用技术,其中 DOM 易于上手,程序易于理解,但缺点在于占用内存大,不适合于解析较大的 XML 文件; SAX 基于事件模型占用系统资源少,能够胜任较大的 XML 文件解析,但解析过程较为繁琐查找元素不方便; Digester/JAXB 基于上述两种技术衍生而来。文中的实例向读者展示了三种 API 的基本使用方法, 在实际开发过程中使用那种技术解析 XML 更好要依据各自的优缺点视具体情况而定。51Testing软件测试网&]4l{{3C;pcY{


TAG:

 

评分:0

我来说两句

Open Toolbar