SAX解析xml (遍历DOM树各节点)
本文参考 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树各节点)的更多相关文章
- Dom,pull,Sax解析XML
本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...
- DOM&SAX解析XML
在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- 解析XML:DOM,SAX,PULL
Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...
- java解析XML之DOM解析和SAX解析(包含CDATA的问题)
Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...
- 经典面试题:一张表区别DOM解析和SAX解析XML
============DOM解析 vs ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- Java xml 操作(Dom4J修改xml + xPath技术 + SAX解析 + XML约束)
1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...
- JAVA解析XML之DOM方式
JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象; 创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...
随机推荐
- 一次web请求发生的神奇故事
网络时代来临的时候,一个食指的点击就能解决很多问题! 那么当你的食指点击的时候,都发生了哪些神奇的事情呢?下面从几个角度为你做一个指引 1. 网络角度:一次网络请求是如何实现的 2. 浏览器角度:He ...
- [MySQL] TRUNCATE数据库所有表,打印所有TRUNCATE表语句
将XXX替换成数据库名称,然后执行SQL,将执行结果拷贝出来执行就可以TRUNCATE数据库所有表了. select CONCAT('truncate table XXX.',TABLE_NAME,' ...
- Watering Grass (贪心,最小覆盖)
参考: https://blog.csdn.net/shuangde800/article/details/7828675 https://www.cnblogs.com/haoabcd2010/p/ ...
- FatMouse' Trade (贪心)
#include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...
- 什么? 1XIN = 21BTC
什么? 1XIN = 21BTC 最初看到这个标题,我还回去考证一下. 原来是 Mixin Network 的宣传广告. BTC 是多少? 2100万枚. XIN 是 100 万枚. 所以才有了 1X ...
- Spring4.x 基础知识点
# Spring4.x 基础知识点## 第二章 快速入门- 一般情况下,需要在业务模块包下进一步按分层模块划分子包,如user\dao.user\service.viewspace\dao.views ...
- Linux常用命令2 权限管理命令
1.权限管理命令:chmod 上面图片中的ugoa与rwx并不是一个命令,而是不同选项 u 所有者 g 所属组 o 其他人 a 所有人 r 读取权限 w写入权限 x 执行权限 chmod u+x ...
- SPSS分析技术:二阶聚类分析;为什么出现大学生“裸贷”业务,因为放贷者知道贷款者还不起
SPSS分析技术:二阶聚类分析:为什么出现大学生"裸贷"业务,因为放贷者知道贷款者还不起 今天将介绍一种智能聚类法,二阶聚类法,在开始介绍之前,先解答很多人在后台提出的一个疑问:那 ...
- phpinfo空白
<?php phpinfo(); ?> 以上代码放入一个kk.php的文件里,但浏览器显示是空白. 原因: 检查php.ini文件里 disable_functions =后面有没有限制p ...
- 【python小随笔】进程池 multiprocessing.Pool的简单实现与踩过的坑
#导入进程模块 import multiprocessing #创建进程池 坑:一定要在循环外面创建进程池,不然会一直创建 pool = multiprocessing.Pool(30) for Si ...