SAX解析XML文档——(二)
SAX从上向下解析,一行一行解析。节省内存,不适合CRUD。
XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名 name="xxxxx">Java高级</书名>
<作者>武陟县</作者>
<价格>200元</价格>
</书>
<书>
<书名>Java中级</书名>
<作者>打火机</作者>
<价格>2000元</价格>
</书>
</书架>
--------------------------------------------解析所有的内容:-----------------
package XMLParse; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.apache.commons.lang.Validate;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader; public class Demo1 { public static void main(String[] args) throws Exception {
// 1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.得到解析器
SAXParser sParser = factory.newSAXParser();
// 3.得到读取器
XMLReader reader = sParser.getXMLReader();
// 4.设置内容处理器
reader.setContentHandler(new ListHandler());
// 5.读取xml文件
reader.parse("src/Book.xml");
}
} // 得到xml文档的所有内容
class ListHandler implements ContentHandler { // 处理开始标签
@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
System.out.println("<" + qName + ">");
// 常用的循环方式 读取属性
for (int i = 0;atts!=null && i < atts.getLength(); i++) {
String attName = atts.getQName(i);
String attValue = atts.getValue(i);
System.out.println(attName+"="+attValue);
}
} // 处理内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
System.out.println(new String(ch, start, length));
} // 处理结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("</" + qName + ">"); } @Override
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub } @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub } @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub } @Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub } @Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub } @Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub } @Override
public void processingInstruction(String target, String data) throws SAXException {
// TODO Auto-generated method stub } @Override
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub } }
结果:
<书架> <书> <书名>
name=xxxxx
Java高级
</书名> <作者>
武陟县
</作者> <价格>
200元
</价格> </书> <书> <书名>
Java中级
</书名> <作者>
打火机
</作者> <价格>
2000元
</价格> </书> </书架>
-----------------------------------------解析指定的标签------------------------------------------------------
package XMLParse; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.apache.commons.lang.Validate;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; public class Demo3 { public static void main(String[] args) throws Exception {
// 1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.得到解析器
SAXParser sParser = factory.newSAXParser();
// 3.得到读取器
XMLReader reader = sParser.getXMLReader();
// 4.设置内容处理器
reader.setContentHandler(new TagValueHandler_1());
// 5.读取xml文件
reader.parse("src/Book.xml");
}
} //读取指定的标签(读取书名)
class TagValueHandler_1 extends DefaultHandler{ private String currentTag; //记住当前的标签是那个
private int needNum = 2; //记住需要第几个
private int currentNum; //记住当前是第几个 @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("书名".equals(qName)){
currentTag="书名";
currentNum++;
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
currentTag=null;
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
if("书名".equals(currentTag)&&needNum==currentNum){
System.out.println(new String(ch,start,length));
}
} }
结果:
Java中级
-------------------------------------解析后封装到对象------------------------------
package XMLParse; import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.apache.commons.lang.Validate;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; public class Demo4 { public static void main(String[] args) throws Exception {
// 1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.得到解析器
SAXParser sParser = factory.newSAXParser();
// 3.得到读取器
XMLReader reader = sParser.getXMLReader();
// 4.设置内容处理器
ListBeanHandler listBeanHandler = new ListBeanHandler();
reader.setContentHandler(listBeanHandler);
// 5.读取xml文件
reader.parse("src/Book.xml");
List<Book> list = listBeanHandler.getList();
System.out.println(list); }
} // 读取指定的标签(读取书名)
class ListBeanHandler extends DefaultHandler { private String currentTag; // 记住当前的标签是那个
private List<Book> list = new ArrayList<Book>();
private Book book; @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentTag = qName;
if ("书".equals(qName)) {
book = new Book();
}
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
if("书名".equals(currentTag)){
book.setName(new String(ch, start, length));
}
if("作者".equals(currentTag)){
book.setAuthor(new String(ch, start, length));
}
if("价格".equals(currentTag)){
book.setPrice(new String(ch, start, length));
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
currentTag = null;
if("书".equals(qName)){
list.add(book);
book=null;
}
} public List<Book> getList() {
return list;
} public void setList(List<Book> list) {
this.list = list;
} }
结果:
aaarticlea/png;base64,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" alt="" />
SAX解析XML文档——(二)的更多相关文章
- 使用SAX解析xml文档
1.首先,在main方法中解析xml文档,具体代码如下: import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import ...
- Sax解析xml文档
测试的xml数据: <?xml version="1.0" encoding="utf-8" ?> <note> <to>G ...
- Java高级特性 第14节 解析XML文档(2) - SAX 技术
一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...
- 浅谈用java解析xml文档(二)
上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点! SAX(Simple API for XML),是指一种接口,或者一个软件包. 首先我们应该知道SAX ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- 四种生成和解析XML文档的方法详解
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术
一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...
- 大杂烩 -- 四种生成和解析XML文档的方法详解
基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...
- java 解析XML文档
Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...
随机推荐
- BZOJ5093 图的价值(NTT+斯特林数)
显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...
- ef 问题汇总
持续更新: 一 属性重命名 数据库:UserName Model: [Column("UserName")]public string UserName222 二, 某表多个外键 ...
- poj2586 【贪心】
Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vital data for ...
- 【POI每日题解 #7】TES-Intelligence Test
题目链接 这道题第一眼看去类比BANK-Cash Dispenser 不过1e6 * 1e6 = 1e12 分分钟MLE啊 想到优化 就yy到一种近似主席树的做法 来维护类似BANK的一堆序列 开 ...
- Leetcode 7.反转整数 By Python
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...
- Python面向对象编程和模块
在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象. 编写类时,你定义一大类对象都有的通用行为.基于类创建对象时,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独 ...
- ReactNative系列组件用法(一)
首先我们来认识view 改变一些特性,再来看看项目的变化 我们新增flex布局的一些属性,再来看看项目的变化 接下来我们来看看如果获取屏幕的分辨率 关于图片的用法,reactNative这里也是很神奇 ...
- 关于chrome控制台出现代码叠加页面不能正常显示大小问题
见下图页面出现在chrome中的情况 描述状态:代码都变小了才出现控制台代码叠加问题 解决办法:使用鼠标滚轮放大代码就行啦,在设置里面让页面的大小显示为100%就可以了.
- The 2016 ACM-ICPC Asia Beijing Regional Contest E - What a Ridiculous Election
https://vjudge.net/contest/259447#problem/E bfs,k个限制条件以数组的额外k维呈现. #include <bits/stdc++.h> usi ...
- Druid 配置及内置监控,Web页面查看监控内容
1.配置Druid的内置监控 首先在Maven项目的pom.xml中引入包 <dependency> <groupId>com.alibaba</groupId> ...