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

1. books.xml

 <?xml version="1.0" encoding="UTF-8"?>
<bk:books count="3" xmlns:bk="http://test.org/books">
<!--books's comment -->
<bk:book id="1">
<bk:name>Thinking in JAVA</bk:name>
</bk:book>
<bk:book id="2">
<bk:name>Core JAVA2</bk:name>
</bk:book>
<bk:book id="3">
<bk:name>C++ primer</bk:name>
<addr:address xmlns:addr="http://test.org/address">
<addr:state>China</addr:state>
<addr:city>ShangHai</addr:city>
</addr:address>
</bk:book>
</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

 package sax.parsing.example;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader; import org.testng.annotations.Test;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory; import bsh.This; class MyContentHandler implements ContentHandler { private StringBuffer stringBuffer;
int frontBlankCount = 0; public String toBlankString(int count) {
StringBuffer buffer = new StringBuffer();
for (int i=0; i<count; i++)
buffer.append(" ");
return buffer.toString();
} @Override
public void setDocumentLocator(Locator locator) {
System.out.println(this.toBlankString(this.frontBlankCount)
+ ">>> set document_locator : (lineNumber = " + locator.getLineNumber()
+ ", columnNumber = " + locator.getColumnNumber()
+ ", systemId = " + locator.getSystemId()
+ ". publicId = " + locator.getPublicId()
+ ")"
);
} @Override
public void startDocument() throws SAXException {
System.out.println(this.toBlankString(frontBlankCount) + ">>> start document");
} @Override
public void endDocument() throws SAXException {
System.out.print(this.toBlankString(frontBlankCount) + ">>> end document");
} @Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
System.out.println("\n" + this.toBlankString(this.frontBlankCount)
+ ">>> start prefix_mapping : xmlns:" + prefix + "=\"" + uri + "\"");
} @Override
public void endPrefixMapping(String prefix) throws SAXException {
System.out.print("\n" + this.toBlankString(this.frontBlankCount) + ">>> end prefix_mapping : " + prefix);
} @Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
System.out.print(this.toBlankString(this.frontBlankCount++) + ">>> start element : "
+ qName + "(" + uri + ")"
);
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print(this.toBlankString(--this.frontBlankCount) + ">>> end element : "
+ qName + "(" + uri + ")"
);
} /**
* Text文本节点 处理
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException { StringBuffer buffer = new StringBuffer(); for (int i=start; i<start+length; i++) {
switch (ch[i]) {
case '\\': buffer.append("\\\\");break;
case '\r': buffer.append("\\r");break;
case '\n': buffer.append("\\n");break;
case '\t': buffer.append("\\t");break;
case '\"': buffer.append("\\\"");break;
default: buffer.append(ch[i]);
}
}
System.out.println("\t>>> characters(" + length + "): " + buffer.toString());
} @Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { StringBuffer buffer = new StringBuffer(); for (int i=start; i<start+length; i++) {
switch (ch[i]) {
case '\\': buffer.append("\\\\");break;
case '\r': buffer.append("\\r");break;
case '\n': buffer.append("\\n");break;
case '\t': buffer.append("\\t");break;
case '\"': buffer.append("\\\"");break;
default: buffer.append(ch[i]);
}
}
System.out.print(this.toBlankString(frontBlankCount)
+ ">>> ignorable whitespace(" + length + "): " + buffer.toString());
} @Override
public void processingInstruction(String target, String data) throws SAXException {
System.out.print(this.toBlankString(this.frontBlankCount)
+ ">>> process instruction : (target = \"" + target + "\", data = \"" + data + ")"); } @Override
public void skippedEntity(String name) throws SAXException {
System.out.print(this.toBlankString(this.frontBlankCount) + ">>> skipped_entity : " + name);
}
} public class SaxTest { @Test
public void test() throws SAXException, FileNotFoundException, IOException { XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://xml.org/sax/features/validation", true);
reader.setFeature("http://xml.org/sax/features/namespaces", true);
reader.setContentHandler(new MyContentHandler());
reader.parse(new InputSource(new FileInputStream("src/sax/parsing/example/books.xml"))); }
} 输出结果:

>>> 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

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

  1. Dom,pull,Sax解析XML

    本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...

  2. DOM&SAX解析XML

    在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...

  3. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  4. 解析XML:DOM,SAX,PULL

    Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...

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

    Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...

  6. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  7. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  8. Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

    1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...

  9. JAVA解析XML之DOM方式

    JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象;    创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...

随机推荐

  1. 一次web请求发生的神奇故事

    网络时代来临的时候,一个食指的点击就能解决很多问题! 那么当你的食指点击的时候,都发生了哪些神奇的事情呢?下面从几个角度为你做一个指引 1. 网络角度:一次网络请求是如何实现的 2. 浏览器角度:He ...

  2. [MySQL] TRUNCATE数据库所有表,打印所有TRUNCATE表语句

    将XXX替换成数据库名称,然后执行SQL,将执行结果拷贝出来执行就可以TRUNCATE数据库所有表了. select CONCAT('truncate table XXX.',TABLE_NAME,' ...

  3. Watering Grass (贪心,最小覆盖)

    参考: https://blog.csdn.net/shuangde800/article/details/7828675 https://www.cnblogs.com/haoabcd2010/p/ ...

  4. FatMouse' Trade (贪心)

    #include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...

  5. 什么? 1XIN = 21BTC

    什么? 1XIN = 21BTC 最初看到这个标题,我还回去考证一下. 原来是 Mixin Network 的宣传广告. BTC 是多少? 2100万枚. XIN 是 100 万枚. 所以才有了 1X ...

  6. Spring4.x 基础知识点

    # Spring4.x 基础知识点## 第二章 快速入门- 一般情况下,需要在业务模块包下进一步按分层模块划分子包,如user\dao.user\service.viewspace\dao.views ...

  7. Linux常用命令2 权限管理命令

    1.权限管理命令:chmod 上面图片中的ugoa与rwx并不是一个命令,而是不同选项 u 所有者  g 所属组 o 其他人 a 所有人 r 读取权限 w写入权限  x 执行权限 chmod u+x ...

  8. SPSS分析技术:二阶聚类分析;为什么出现大学生“裸贷”业务,因为放贷者知道贷款者还不起

    SPSS分析技术:二阶聚类分析:为什么出现大学生"裸贷"业务,因为放贷者知道贷款者还不起 今天将介绍一种智能聚类法,二阶聚类法,在开始介绍之前,先解答很多人在后台提出的一个疑问:那 ...

  9. phpinfo空白

    <?php phpinfo(); ?> 以上代码放入一个kk.php的文件里,但浏览器显示是空白. 原因: 检查php.ini文件里 disable_functions =后面有没有限制p ...

  10. 【python小随笔】进程池 multiprocessing.Pool的简单实现与踩过的坑

    #导入进程模块 import multiprocessing #创建进程池 坑:一定要在循环外面创建进程池,不然会一直创建 pool = multiprocessing.Pool(30) for Si ...