SAX解析xml (遍历DOM树各节点)

本文参考 http://yangjunfeng.iteye.com/blog/401377

1. books.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <bk:books count="3" xmlns:bk="http://test.org/books">
 3     <!--books‘s comment -->
 4     <bk:book id="1">
 5         <bk:name>Thinking in JAVA</bk:name>
 6     </bk:book>
 7     <bk:book id="2">
 8         <bk:name>Core JAVA2</bk:name>
 9     </bk:book>
10     <bk:book id="3">
11         <bk:name>C++ primer</bk:name>
12         <addr:address xmlns:addr="http://test.org/address">
13             <addr:state>China</addr:state>
14             <addr:city>ShangHai</addr:city>
15         </addr:address>
16     </bk:book>
17 </bk:books> 

xml文件基本结构:

<books>Text文本节点("\n\t"换行+制表符)

  <book>Text文本节点("\n\t\t"换行+2个制表符)

    <name>Text文本节点("Thinking in JAVA")</name>Text文本节点("\n\t"换行+制表符)

  </book>

.......

.......

</books>

2. 使用SAX api 解析xml

  1 package sax.parsing.example;
  2
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.io.IOException;
  6 import java.io.Reader;
  7
  8 import org.testng.annotations.Test;
  9 import org.xml.sax.Attributes;
 10 import org.xml.sax.ContentHandler;
 11 import org.xml.sax.InputSource;
 12 import org.xml.sax.Locator;
 13 import org.xml.sax.SAXException;
 14 import org.xml.sax.XMLReader;
 15 import org.xml.sax.helpers.XMLReaderFactory;
 16
 17 import bsh.This;
 18
 19
 20 class MyContentHandler implements ContentHandler {
 21
 22     private StringBuffer stringBuffer;
 23     int frontBlankCount = 0;
 24
 25
 26     public String toBlankString(int count) {
 27         StringBuffer buffer = new StringBuffer();
 28         for (int i=0; i<count; i++)
 29             buffer.append("    ");
 30         return buffer.toString();
 31     }
 32
 33     @Override
 34     public void setDocumentLocator(Locator locator) {
 35         System.out.println(this.toBlankString(this.frontBlankCount)
 36                 + ">>> set document_locator : (lineNumber = " + locator.getLineNumber()
 37                 + ", columnNumber = " + locator.getColumnNumber()
 38                 + ", systemId = " + locator.getSystemId()
 39                 + ". publicId = " + locator.getPublicId()
 40                 + ")"
 41                 );
 42     }
 43
 44     @Override
 45     public void startDocument() throws SAXException {
 46         System.out.println(this.toBlankString(frontBlankCount) + ">>> start document");
 47     }
 48
 49     @Override
 50     public void endDocument() throws SAXException {
 51         System.out.print(this.toBlankString(frontBlankCount) + ">>> end document");
 52     }
 53
 54     @Override
 55     public void startPrefixMapping(String prefix, String uri) throws SAXException {
 56         System.out.println("\n" + this.toBlankString(this.frontBlankCount)
 57                 + ">>> start prefix_mapping : xmlns:" + prefix + "=\"" + uri + "\"");
 58     }
 59
 60     @Override
 61     public void endPrefixMapping(String prefix) throws SAXException {
 62         System.out.print("\n" + this.toBlankString(this.frontBlankCount) + ">>> end prefix_mapping : " + prefix);
 63     }
 64
 65     @Override
 66     public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
 67         System.out.print(this.toBlankString(this.frontBlankCount++) + ">>> start element : "
 68                     + qName + "(" + uri + ")"
 69                     );
 70     }
 71
 72     @Override
 73     public void endElement(String uri, String localName, String qName) throws SAXException {
 74         System.out.print(this.toBlankString(--this.frontBlankCount) + ">>> end element : "
 75                 + qName + "(" + uri + ")"
 76                 );
 77     }
 78
 79     /**
 80      *  Text文本节点 处理
 81      */
 82     @Override
 83     public void characters(char[] ch, int start, int length) throws SAXException {
 84
 85         StringBuffer buffer = new StringBuffer();
 86
 87         for (int i=start; i<start+length; i++) {
 88             switch (ch[i]) {
 89                 case ‘\\‘: buffer.append("\\\\");break;
 90                 case ‘\r‘: buffer.append("\\r");break;
 91                 case ‘\n‘: buffer.append("\\n");break;
 92                 case ‘\t‘: buffer.append("\\t");break;
 93                 case ‘\"‘: buffer.append("\\\"");break;
 94                 default: buffer.append(ch[i]);
 95             }
 96         }
 97         System.out.println("\t>>> characters(" + length + "): " + buffer.toString());
 98     }
 99
100     @Override
101     public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
102
103         StringBuffer buffer = new StringBuffer();
104
105         for (int i=start; i<start+length; i++) {
106             switch (ch[i]) {
107                 case ‘\\‘: buffer.append("\\\\");break;
108                 case ‘\r‘: buffer.append("\\r");break;
109                 case ‘\n‘: buffer.append("\\n");break;
110                 case ‘\t‘: buffer.append("\\t");break;
111                 case ‘\"‘: buffer.append("\\\"");break;
112                 default: buffer.append(ch[i]);
113             }
114         }
115         System.out.print(this.toBlankString(frontBlankCount)
116                 + ">>> ignorable whitespace(" + length + "): " + buffer.toString());
117     }
118
119     @Override
120     public void processingInstruction(String target, String data) throws SAXException {
121         System.out.print(this.toBlankString(this.frontBlankCount)
122                 + ">>> process instruction : (target = \"" + target + "\", data = \"" + data + ")");
123
124     }
125
126     @Override
127     public void skippedEntity(String name) throws SAXException {
128         System.out.print(this.toBlankString(this.frontBlankCount) + ">>> skipped_entity : " + name);
129     }
130 }
131
132 public class SaxTest {
133
134
135     @Test
136     public void test() throws SAXException, FileNotFoundException, IOException {
137
138
139         XMLReader reader = XMLReaderFactory.createXMLReader();
140         reader.setFeature("http://xml.org/sax/features/validation", true);
141         reader.setFeature("http://xml.org/sax/features/namespaces", true);
142         reader.setContentHandler(new MyContentHandler());
143         reader.parse(new InputSource(new FileInputStream("src/sax/parsing/example/books.xml")));
144
145     }
146 }

输出结果:

>>> set document_locator : (lineNumber = 1, columnNumber = 1, systemId = null. publicId = null)
>>> start document
[Error] :5:10: Document is invalid: no grammar found.
[Error] :5:10: Document root element "bk:books", must match DOCTYPE root "null".

>>> start prefix_mapping : xmlns:bk="http://test.org/books"
>>> start element : bk:books(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(16): Thinking in JAVA
    >>> end element : bk:name(http://test.org/books) >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(10): Core JAVA2
    >>> end element : bk:name(http://test.org/books) >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(10): C++ primer
    >>> end element : bk:name(http://test.org/books) >>> characters(3): \n\t\t

    >>> start prefix_mapping : xmlns:addr="http://test.org/address"
    >>> start element : addr:address(http://test.org/address) >>> characters(4): \n\t\t\t
      >>> start element : addr:state(http://test.org/address) >>> characters(5): China
      >>> end element : addr:state(http://test.org/address) >>> characters(4): \n\t\t\t
      >>> start element : addr:city(http://test.org/address) >>> characters(8): ShangHai
      >>> end element : addr:city(http://test.org/address) >>> characters(3): \n\t\t
    >>> end element : addr:address(http://test.org/address)
    >>> end prefix_mapping : addr >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(1): \n
>>> end element : bk:books(http://test.org/books)
>>> end prefix_mapping : bk>>> end document

时间: 2024-08-27 13:53:19

SAX解析xml (遍历DOM树各节点)的相关文章

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr

DOM&amp;SAX解析XML

在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式,而SAX是民间(非官方)的,两种解析方式是很不一样的.下面通过例子来分析两种解析方式的区别. 下面是要解析的xml文档 1 <?xml version="1.0" encoding="utf-8"?> 2 <学生名册> 3 <!--http

java解析XML① 之DOM解析和SAX解析(包含CDATA的问题)

Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些

SAX解析XML

SAX 事件处理(事件驱动),不需要载入整个文档,流机制读取,分析XML文档 startDocument startElement character endElement endDocument 当sax扫描到文档时就调用startDocument函数,sax扫描到文档结束符时就调用endDocument函数,也就是说当sax扫描到哪个节点时就会调用相应的函数,同时还会携带节点的属性值. 当它扫描到节点内容值时就会调用character函数 Sax主要是用来对xml文件遍历,解析,不提供修改.

JAVA解析XML之DOM方式

JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象;    创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法加载xml 解析XML文件的属性名和属性值 解析XML文件的节点名和节点值 常用方法如下: getElementsByTagName(); getLength(); item(); getNodeName(); getNodeValue(); getNodeType(); *getAttribute

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

Java xml 操作(Dom4J修改xml &#160;&#160;+ xPath技术 &#160;+ SAX解析 + XML约束)

1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签. 属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单 双混用. 文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8&q

SAX解析XML 详解

JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构.但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的.     SAX是一种XML解析的替代方法.相比于文档对象模型DOM,SAX 是读

6. SAX解析XML

SAX解析: SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分: 解析器和事件处理器 : 1. 解析器可以使用SAXP的API创建,创建出SAX解析器后, 就可以指定解析器去解析某个XML文档. 解析器采用SAX方式在解析某个XML文档时, 它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法, 解析器在调用事件处理器的方法时, 会把当前解析到的xml文件内容作为方法的参数传递给事件处理器. 2. 事件处理器由程序员编写,程序员通过事件处理器