SAX解析xml (遍历DOM树各节点)
本文参考 http://yangjunfeng.iteye.com/blog/401377
1. books.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <bk:books count="3" xmlns:bk="http://test.org/books"> 3 <!--books's comment --> 4 <bk:book id="1"> 5 <bk:name>Thinking in JAVA</bk:name> 6 </bk:book> 7 <bk:book id="2"> 8 <bk:name>Core JAVA2</bk:name> 9 </bk:book> 10 <bk:book id="3"> 11 <bk:name>C++ primer</bk:name> 12 <addr:address xmlns:addr="http://test.org/address"> 13 <addr:state>China</addr:state> 14 <addr:city>ShangHai</addr:city> 15 </addr:address> 16 </bk:book> 17 </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
1 package sax.parsing.example; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.Reader; 7 8 import org.testng.annotations.Test; 9 import org.xml.sax.Attributes; 10 import org.xml.sax.ContentHandler; 11 import org.xml.sax.InputSource; 12 import org.xml.sax.Locator; 13 import org.xml.sax.SAXException; 14 import org.xml.sax.XMLReader; 15 import org.xml.sax.helpers.XMLReaderFactory; 16 17 import bsh.This; 18 19 20 class MyContentHandler implements ContentHandler { 21 22 private StringBuffer stringBuffer; 23 int frontBlankCount = 0; 24 25 26 public String toBlankString(int count) { 27 StringBuffer buffer = new StringBuffer(); 28 for (int i=0; i<count; i++) 29 buffer.append(" "); 30 return buffer.toString(); 31 } 32 33 @Override 34 public void setDocumentLocator(Locator locator) { 35 System.out.println(this.toBlankString(this.frontBlankCount) 36 + ">>> set document_locator : (lineNumber = " + locator.getLineNumber() 37 + ", columnNumber = " + locator.getColumnNumber() 38 + ", systemId = " + locator.getSystemId() 39 + ". publicId = " + locator.getPublicId() 40 + ")" 41 ); 42 } 43 44 @Override 45 public void startDocument() throws SAXException { 46 System.out.println(this.toBlankString(frontBlankCount) + ">>> start document"); 47 } 48 49 @Override 50 public void endDocument() throws SAXException { 51 System.out.print(this.toBlankString(frontBlankCount) + ">>> end document"); 52 } 53 54 @Override 55 public void startPrefixMapping(String prefix, String uri) throws SAXException { 56 System.out.println("\n" + this.toBlankString(this.frontBlankCount) 57 + ">>> start prefix_mapping : xmlns:" + prefix + "=\"" + uri + "\""); 58 } 59 60 @Override 61 public void endPrefixMapping(String prefix) throws SAXException { 62 System.out.print("\n" + this.toBlankString(this.frontBlankCount) + ">>> end prefix_mapping : " + prefix); 63 } 64 65 @Override 66 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 67 System.out.print(this.toBlankString(this.frontBlankCount++) + ">>> start element : " 68 + qName + "(" + uri + ")" 69 ); 70 } 71 72 @Override 73 public void endElement(String uri, String localName, String qName) throws SAXException { 74 System.out.print(this.toBlankString(--this.frontBlankCount) + ">>> end element : " 75 + qName + "(" + uri + ")" 76 ); 77 } 78 79 /** 80 * Text文本节点 处理 81 */ 82 @Override 83 public void characters(char[] ch, int start, int length) throws SAXException { 84 85 StringBuffer buffer = new StringBuffer(); 86 87 for (int i=start; i<start+length; i++) { 88 switch (ch[i]) { 89 case '\\': buffer.append("\\\\");break; 90 case '\r': buffer.append("\\r");break; 91 case '\n': buffer.append("\\n");break; 92 case '\t': buffer.append("\\t");break; 93 case '\"': buffer.append("\\\"");break; 94 default: buffer.append(ch[i]); 95 } 96 } 97 System.out.println("\t>>> characters(" + length + "): " + buffer.toString()); 98 } 99 100 @Override 101 public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { 102 103 StringBuffer buffer = new StringBuffer(); 104 105 for (int i=start; i<start+length; i++) { 106 switch (ch[i]) { 107 case '\\': buffer.append("\\\\");break; 108 case '\r': buffer.append("\\r");break; 109 case '\n': buffer.append("\\n");break; 110 case '\t': buffer.append("\\t");break; 111 case '\"': buffer.append("\\\"");break; 112 default: buffer.append(ch[i]); 113 } 114 } 115 System.out.print(this.toBlankString(frontBlankCount) 116 + ">>> ignorable whitespace(" + length + "): " + buffer.toString()); 117 } 118 119 @Override 120 public void processingInstruction(String target, String data) throws SAXException { 121 System.out.print(this.toBlankString(this.frontBlankCount) 122 + ">>> process instruction : (target = \"" + target + "\", data = \"" + data + ")"); 123 124 } 125 126 @Override 127 public void skippedEntity(String name) throws SAXException { 128 System.out.print(this.toBlankString(this.frontBlankCount) + ">>> skipped_entity : " + name); 129 } 130 } 131 132 public class SaxTest { 133 134 135 @Test 136 public void test() throws SAXException, FileNotFoundException, IOException { 137 138 139 XMLReader reader = XMLReaderFactory.createXMLReader(); 140 reader.setFeature("http://xml.org/sax/features/validation", true); 141 reader.setFeature("http://xml.org/sax/features/namespaces", true); 142 reader.setContentHandler(new MyContentHandler()); 143 reader.parse(new InputSource(new FileInputStream("src/sax/parsing/example/books.xml"))); 144 145 } 146 } 输出结果:
>>> 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
转载于:https://www.cnblogs.com/asnjudy/p/4236403.html
SAX解析xml (遍历DOM树各节点)相关推荐
- 解析XML方式-DOM,SAX
students.xml <?xml version="1.0" encoding="UTF-8"?> <students><st ...
- SAX解析XML文件
就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...
- Java 使用SAX解析XML文档
DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...
- SAX解析XML 详解
JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...
- python输出价目表-Python:使用基于事件驱动的SAX解析XML
SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...
- android 如何使用SAX解析XML
今天,简单讲讲android如何使用SAX解析XML . 昨天,我看代码时,看到了解析xml文档的代码,是使用SAX解析XML.但是我却不会使用SAX,于是在网上查找资料,最终解决了问题.这里记录一下 ...
- XML解析(一),SAX解析XML
转载自 XML解析(一),SAX解析XML 一.概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...
- android用sax解析xml,详解android使用SAX解析XML文件
解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...
- JAVA-使用SAX解析XML数据
一.SAX (Simple API for XML) SAX解析XML文件采用的是事件驱动,它不需要解析完整个文档,而是一边按内容顺序解析文档,一般判断当前读到的字符是否符合XML语法中的某部分,如果 ...
最新文章
- CSS-home.htm
- tensorflow省钱方案-ml-engine
- 【JavaSE01】初识Java-思维导图
- 【freemarker】渲染列表一系列操作
- C语言基本类型和存储类别
- Oppoa7手机怎么录视频 oppo手机屏幕录制
- MySQL索引底层实现原理
- python获取绝对路径的区别_python 获取路径不同方法的比较
- python怎么用字符画_用Python把图片变成字符画
- Java集合框架--List、Set、Map
- Style transfer系列论文之——Arbitrary Style Transfer in Real-time with Adaptive Instance Normali,ICCV, 2017
- c4d细分曲面的使用和导出的一些快捷键笔记
- 2022-2027年中国植物染料行业市场全景评估及发展战略规划报告
- VelocityTracker 使用
- 数据中台漫谈 — 数据接入
- android studio 扣费白屏,详解一次Vue低版本安卓白屏问题的解决过程
- Riverbed助力Interplex成功使用机器人技术
- USB Type C告白
- Visual Studio调试XtraReport脚本
- 在ubuntu18.04上安装vmware