本文参考 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. 解决CSDN博客插入代码出现的问题

    我在写CSDN博客的时候有时候会在插入代码之后继续编辑,然后保存之后经常会出现一些多余的符号<p 例如<pre></pre>,这样的标记,其实这是html的一个元素,pr ...

  2. C# 详解反射

    原博客:http://www.cnblogs.com/Stephenchao/p/4481995.html 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的 ...

  3. SpringBoot启动报错Failed to determine a suitable driver class

    SpringBoot启动报错如下 Error starting ApplicationContext. To display the conditions report re-run your app ...

  4. vue中router以及route的使用

    路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...

  5. 【难为听】weex-ui

    eslint 不喜欢,但是确实规范了代码,同古代统一货币一样,有无穷的意义.故喜欢 weex-ui在项目中的使用方法 npm install -g weex-toolkit@latest weex c ...

  6. golang中包的初始化

    1.当一个go源程序被初始化时,首先去初始化所依赖的其他包,然后初始化该go源码文件的全局变量的初始化和执行初始化函数,其中该包所有的全局变量初始化在前,该包的初始化函数int在后.当所有包的初始化函 ...

  7. Gradle中的buildScript,gradle wrapper,dependencies等一些基础知识

    就想收藏一篇好文,哈哈,无他 Gradle中的buildScript代码块 - 黄博文 然后记录一些gradle的基础知识: 1.gradle wrapper就是对gradle的封装,可以理解为项目内 ...

  8. js中小知识点

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前 ...

  9. Linux进程管理(四、 进程终结)

    进程调用exit()会终结当前进程,可以显式调用,也可以隐式: c语言main函数结束时编译器会自动加入exit调用 exit是系统调用,对应内核里的sys_exit() -> do_exit( ...

  10. linux包之包管理rpm-yum

    背景 YUM(Yellow dog Updater, Modified)为多个Linux发行版的前端软件包管理器,例如 Redhat RHEL, CentOS & Fedora. YUM通过调 ...