本文参考 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. Spring MVC使用ModelAndView进行重定向(转)

    1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...

  2. Location 位置 history

    拆分出来地址  让地址各归其位 search案例 查找历史记录跳转

  3. Anaconda入门使用指南

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...

  4. List容器案例

    案例讲解 迭代模式 不暴露集合的内部结构,又让外部访问集合中的数据 package com.day1; public interface Iterator <T>{ public bool ...

  5. Python学习之路4☞条件和循环

    一.if语句 1.1 功能 计算机又被称作电脑,意指计算机可以像人脑一样,根据周围环境条件(即expession)的变化做出不同的反应(即执行代码) if语句就是来控制计算机实现这一功能 1.2 语法 ...

  6. hdu4178 乱搞

    #include<stdio.h> #include<string.h> #define maxn 100 char name[maxn]; ]; int main() { , ...

  7. 折腾spring boot 应用

    开发环境 安装配置java环境 配置maven环境,修改镜像地址 <mirror> <id>aliyunmaven</id> <mirrorOf>*&l ...

  8. js数组增删

    1.shift() 2.pop() 3.push() 4.unshift() 5.splice(start,num,string...)

  9. 页面头部<meta>中的属性和含义

    1<meta name="robots" content="index, follow" />    none:搜索引擎将忽略此网页,等价于noin ...

  10. 用div漂浮快实现与表单无关的多文件上传功能。

    我项目有这个需求,多文件上传,而且要及时显示到表单上,这样的话就不能与表单相关. 由于我对前端不熟,我就实现了这么一个功能,通过button触发一个div漂浮块,然后多文件上传,之后通过js把文件名显 ...