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方法 ...
随机推荐
- WPF 如何显示gif
最近碰到了要显示表情的需求,而表情刚好是gif的图片. 于是用了Image试了下,发现不行,只会显示第一帧,然后上网查了下资料,大致有这么几种方法,都可以实现. 第一种: 使用Winfrom里面的pi ...
- 抽象类 abstract class 接口
一.抽象类 1.没有具体的实例. 不可实例化,不能创建对象. 2.抽象类有构造器. 二.abstract 方法. 1.没有方法体. 子类必须重写抽象类的所有抽象方法,才能实例化,否则子类也为抽象类. ...
- 可复用且高度解耦的iOS用户统计实现
http://www.cocoachina.com/ios/20160421/15912.html 本文为投稿文章,作者:编程小翁(简书) 用户统计 用户行为统计(User Behavior Stat ...
- onethink二级导航调用
<ul class="nav-main">//添加tree参数 <think:nav name="nav" tree="true&q ...
- system_service进程里 调用SystemManager.getService("activity") 直接返回ams的引用?
我们知道ActivityManager是运行在system_service进程里的,但是最近看代码发现在这个进程的其他服务线程里为了获取AMS调用: ActivityManagerService am ...
- 【JZOJ3873】【NOIP2014八校联考第4场第2试10.20】乐曲创作(music)
ujfuiaty 小可可是音乐学院的一名学生,他需要经常创作乐曲完成老师布置的作业. 可是,小可可是一个懒惰的学生.所以,每次完成作业时,他不会重新创作一首新的乐曲,而是去修改上一次创作过的乐曲作为作 ...
- 帮助你构建云服务的开源平台:openstack
from:http://os.51cto.com/art/201205/336386_all.htm 概念架构 3-5 OpenStack Compute服务架构 点评:从openstack的能力来看 ...
- larbin终于编译完成
1.目前sourceforge不能下载,只能找mirror进行下载了: 2.一些头文件始终找不到,定位了一下,应该是makefile中设置有问题,把CXXFLAGS中的-I-去掉,即可编译成功:
- sping,springMVC @Component 注解的对象都是单例模式,变量不能全局
错误方式: 将属性和变量定义为全局,单例模式,所有人共享,导致所有人的数据都发生错误! 正确方式 一: 将变量定义到局部,互不影响. 正确方式 二: 假如必须放到全局所有方法 ...
- python Python程序的架构