笔记:XML-解析文档-流机制解析器(SAX、StAX)
DOM
解析器完整的读入XML文档,然后将其转换成一个树型的数据结构,对于大多数应用,DOM 都运行很好,但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那么我们应该使用流机制解析器(streaming parser),Java 类库提供的流解析机制有 SAX 解析器和 StAX 解析器,SAX 解析器是基于事件回调机制,而 StAX解析器提供了解析事件的迭代器。
- 使用SAX解析器
SAX
解析器在解析XML 输入的组成部分时会报告事件,在使用 SAX 解析器时,需要一个处理器来为不同的解析器事件定义事件动作,ContentHandler 接口定义了若干个在解析文档时解析器会调用的回调方法,我们可以使用
DefaultHandler
类,该类继承与
ContentHandler
并提供了默认实现,重要的方法如下:
- startDocument:在文档开始时调用一次
- endDocument:在文档结束时调用一次
- startElement:在遇到起始标签时调用,有3个描述元素名的参数,其中qName参数标识标签限定名,如果命名空间处理特性打开,则
uri
表示的是命名空间,localName 表示的是本地名。 - endElement:在遇到结束标签时调用,其参数和
startElement
一致 - characters:在每当遇到字符数据时调用,如果标签没有内容,但有子标签时,其中的空格会作为字符数据返回
示例代码如下:
- 事件处理类
public class CustomDefaultHandler extends DefaultHandler {
@Override
public
void
startDocument() throws SAXException {super.startDocument();
System.out.println("call startDocument");
}
@Override
public
void
endDocument() throws SAXException {super.endDocument();
System.out.println("call endDocument");
}
@Override
public
void
characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);
String chs = new
String(ch, start, length);System.out.println("characters ch=" + chs + " start=" + start + " length=" + length);
}
@Override
public
void
startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);
StringBuilder sb = new
StringBuilder();for (int i = 0; i < attributes.getLength(); i++) {
sb.append(attributes.getLocalName(i) + "=\"" + attributes.getValue(i) + "\"
");}
System.out.println("startElement qName=" + qName + " Uri=" + uri + " localName=" + localName + " "
+ sb.toString());
}
@Override
public
void
endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);
System.out.println("endElement " + qName);
}
}
- 调用类
try {
Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");
InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(xmlStream, new
CustomDefaultHandler());} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 使用StAX解析器
StAX
解析器时一种拉解析器(pull
parser),与安装事件处理器不同,只需要使用基本的循环来迭代所有事件,示例代码如下:try {
Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");
InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);
XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader parser = factory.createXMLStreamReader(xmlStream);
while (parser.hasNext()) {
int event = parser.next();
switch (event) {
case XMLStreamConstants.START_DOCUMENT:
System.out.println("START_DOCUMENT Call");
break;
case XMLStreamConstants.END_DOCUMENT:
System.out.println("END_DOCUMENT Call");
break;
case XMLStreamConstants.START_ELEMENT:
StringBuilder sb = new
StringBuilder();for (int i = 0; i < parser.getAttributeCount(); i++) {
sb.append(parser.getAttributeName(i) + "=\"" + parser.getAttributeValue(i) + "\"
");}
System.out.println("START_ELEMENT qName=" + parser.getName() + " Uri="
+ parser.getNamespaceURI() + " localName=" + parser.getLocalName() + " attribute="
+ sb.toString());
break;
case XMLStreamConstants.END_ELEMENT:
System.out.println("END_ELEMENT qName=" + parser.getName() + " Uri=" + parser.getNamespaceURI()
+ " localName=" + parser.getLocalName());
break;
case XMLStreamConstants.CHARACTERS:
int start = parser.getTextStart();
int length = parser.getTextLength();
System.out.println("CHARACTERS text=" + new
String(parser.getTextCharacters(), start, length));break;
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
笔记:XML-解析文档-流机制解析器(SAX、StAX)的更多相关文章
- 前端学习笔记之CSS文档流
先引用一段W3C的文档: 9.3 Positioning schemes In CSS 2.1, a box may be laid out according to three positionin ...
- 源生API解析XML文档与dom4j解析XML文档
一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...
- [Swift通天遁地]七、数据与安全-(2)对XML和HTML文档的快速解析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 2.1 使用JAXP 对 xml文档进行DOM解析
//使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...
- XML之DOM解析文档 Day24
TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...
- 文档ID:某某 模板文件不存在,无法解析文档!
如果是生成栏目列表时出现这样的问题]: 1.可以修改include/arc.listview.class.php这个文件. 2.复制代码 echo "模板文件不存在,无法解析文档 ...
- DedeCMS模板文件不存在,无法解析文档! 问题定位方法
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
- dedecms 模板文件不存在,无法解析文档"的终极各种解决办法
方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives.class.php 556行 if (!preg_match(&qu ...
- dedecms 模板文件不存在 无法解析文档!问题定位方法!
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
随机推荐
- ip2long的用法
ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int Description int ip2long ( string ip_address ) 如果ip地址非法,返回FALSE(PH ...
- zTree实现地市县三级级联报错(二)
zTree实现地市县三级级联 1.具体报错如下 2014-05-10 23:29:13 [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolT ...
- c# 处理空白字符,空白字符是指在屏幕不会显示出来的字符
空白字符是指在屏幕不会显示出来的字符(如空格,制表符tab,回车换行等).空格.制表符.换行符.回车.换页垂直制表符和换行符称为 "空白字符",因为它们为与间距单词和行在打印的页 ...
- Linux显示使用者将不能利用交谈式指令来对行程
Linux显示使用者将不能利用交谈式指令来对行程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ top -s top - 19:23:34 up 52 min ...
- 使用Python收集获取Linux系统主机信息
爬虫代理IP由芝麻HTTP服务供应商提供 使用 python 代码收集主机的系统信息,主要:主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存等系统信息. #!/usr/bin/en ...
- e.preventDefault()和e.stopPropagation()以及return false的作用和区别
前段时间开发中,遇到一个父元素和子元素都有事件时,发现会出现事件冒泡现象,虽然知道ev.stopPropagation()和ev.preventDefault()其中一个是阻止事件冒泡和阻止默认行为, ...
- SpringMVC拦截器(包括自定以拦截器--实现HandlerInterceptorAdapter)(资源和权限管理)
一,springmvc的配置 <!-- 访问拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping ...
- JAVA中String类的方法(函数)总结--JAVA基础
1.concat()方法,当参数为两字符串时,可实现字符串的连接: package cn.nxl123.www; public class Test { public static void main ...
- C#迭代语句、跳转语句--C#基础
1.foreach每执行一次内含的代码时,循环变量就会一次读取集合中的一个元素,不需要个数.循环变量只是一个只读的局部变量,这个值是不能修改的.char后的word是 foreach语句的迭代变量,它 ...
- 【BZOJ3143】游走(高斯消元,数学期望)
[BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...