本文参考 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树各节点)相关推荐

  1. 解析XML方式-DOM,SAX

    students.xml <?xml version="1.0" encoding="UTF-8"?> <students><st ...

  2. SAX解析XML文件

    就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...

  3. Java 使用SAX解析XML文档

    DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...

  4. SAX解析XML 详解

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...

  5. python输出价目表-Python:使用基于事件驱动的SAX解析XML

    SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...

  6. android 如何使用SAX解析XML

    今天,简单讲讲android如何使用SAX解析XML . 昨天,我看代码时,看到了解析xml文档的代码,是使用SAX解析XML.但是我却不会使用SAX,于是在网上查找资料,最终解决了问题.这里记录一下 ...

  7. XML解析(一),SAX解析XML

    转载自  XML解析(一),SAX解析XML 一.概述  SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...

  8. android用sax解析xml,详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...

  9. JAVA-使用SAX解析XML数据

    一.SAX (Simple API for XML) SAX解析XML文件采用的是事件驱动,它不需要解析完整个文档,而是一边按内容顺序解析文档,一般判断当前读到的字符是否符合XML语法中的某部分,如果 ...

最新文章

  1. CSS-home.htm
  2. tensorflow省钱方案-ml-engine
  3. 【JavaSE01】初识Java-思维导图
  4. 【freemarker】渲染列表一系列操作
  5. C语言基本类型和存储类别
  6. Oppoa7手机怎么录视频 oppo手机屏幕录制
  7. MySQL索引底层实现原理
  8. python获取绝对路径的区别_python 获取路径不同方法的比较
  9. python怎么用字符画_用Python把图片变成字符画
  10. Java集合框架--List、Set、Map
  11. Style transfer系列论文之——Arbitrary Style Transfer in Real-time with Adaptive Instance Normali,ICCV, 2017
  12. c4d细分曲面的使用和导出的一些快捷键笔记
  13. 2022-2027年中国植物染料行业市场全景评估及发展战略规划报告
  14. VelocityTracker 使用
  15. 数据中台漫谈 — 数据接入
  16. android studio 扣费白屏,详解一次Vue低版本安卓白屏问题的解决过程
  17. Riverbed助力Interplex成功使用机器人技术
  18. USB Type C告白
  19. Visual Studio调试XtraReport脚本
  20. 在ubuntu18.04上安装vmware

热门文章

  1. 图像平滑处理(归一化块滤波、高斯滤波、中值滤波、双边滤波)
  2. 2016年,C语言该怎样写
  3. 如何建立你自己的Docker镜像
  4. 以太网单播、组播、广播
  5. Linux系列-Red Hat5平台下的LAMP网站服务搭建(四)
  6. shape file与coverage叠加的问题
  7. 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set
  8. Vue封装一个简单轻量的上传文件组件
  9. 串行总线---差分互连(差分线)之共模、奇模、偶模
  10. 吴恩达:现在很多所谓的AI公司,其实都不是AI公司