由switch 类触发事件

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; abstract class DelegateHandler extends DefaultHandler{ public abstract void startDocument(String uri, String localName, String qName, Attributes attributes) throws SAXException; public abstract void endDocument(String uri, String localName, String qName) throws SAXException; }

由api 触发事件

import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; class SwitchHandler extends DefaultHandler { private final Map<String, DelegateHandler> handlerMap; private List<String> path = new ArrayList<String>();
private String currentHandlerPath = null; public SwitchHandler(Map<String, DelegateHandler> handlerMap) {
this.handlerMap = handlerMap;
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// update path (increase)
setPath(qName, true); String path = getPath();
// startDocument
if (handlerMap.containsKey(path)) {
handlerMap.get(path).startDocument(uri, localName, qName, attributes);
currentHandlerPath = path;
}
// startElement
else if (currentHandlerPath != null && path.startsWith(currentHandlerPath)) {
handlerMap.get(currentHandlerPath).startElement(uri, localName, qName, attributes);
}
} @Override
public void characters(char ch[], int start, int length) throws SAXException {
if (currentHandlerPath != null) {
handlerMap.get(currentHandlerPath).characters(ch, start, length);
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException { String path = getPath(); // endDocument
if (handlerMap.containsKey(path)) {
handlerMap.get(path).endDocument(uri, localName, qName);
currentHandlerPath = null;
}
// endElement
else if (currentHandlerPath != null && path.startsWith(currentHandlerPath)) {
handlerMap.get(currentHandlerPath).endElement(uri, localName, qName);
} // update path (reduce)
setPath(qName, false);
} public String getPath() {
StringBuilder sb = new StringBuilder();
for (String str : this.path) {
sb.append("/");
sb.append(str);
}
return sb.toString();
} public void setPath(String qName, boolean add) {
if (add) {
this.path.add(qName);
} else {
this.path.remove(path.size() - 1);
}
} }

具体的实现

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader; public class SaxTest { public static void main(String[] args) throws Exception {
SaxTest saxTest = new SaxTest();
InputStream in = SaxTest.class.getResourceAsStream("test.xml");
InputStreamReader inr = new InputStreamReader(in);
System.out.println(saxTest.exchange(inr));
} public String exchange(Reader reader) throws Exception { // xpath
Map<String, DelegateHandler> handlerMap = new HashMap<String, DelegateHandler>();
TeacherHandler teacherHandler = new TeacherHandler();
StudentHandler studentHandler = new StudentHandler();
handlerMap.put("/class/teacher", teacherHandler);
handlerMap.put("/class/student", studentHandler);
SwitchHandler switchHandler = new SwitchHandler(handlerMap); // sax
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(switchHandler);
xmlReader.parse(new InputSource(reader)); // data
StringWriter writer = new StringWriter();
for (String teacher : teacherHandler.teacherList) {
writer.write("teacher:" + teacher + "\n");
}
for (String student : studentHandler.studentList) {
writer.write("student:" + student + "\n");
}
return writer.toString();
} private class TeacherHandler extends DelegateHandler { List<String> teacherList = new ArrayList<String>();
StringBuilder characters = new StringBuilder();
String id = null;
String name = null; @Override
public void startDocument(String uri, String localName, String qName, Attributes attributes)
throws SAXException { } @Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
characters.append(ch, start, length);
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("id")) {
id = characters.toString().trim();
} else if (qName.equals("name")) {
name = characters.toString().trim();
teacherList.add(id + " = " + name);
}
characters.setLength(0);
} @Override
public void endDocument(String uri, String localName, String qName) throws SAXException { } } private class StudentHandler extends DelegateHandler { List<String> studentList = new ArrayList<String>();
StringBuilder characters = new StringBuilder();
String id = null;
String name = null; @Override
public void startDocument(String uri, String localName, String qName, Attributes attributes)
throws SAXException { } @Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
characters.append(ch, start, length);
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("id")) {
id = characters.toString().trim();
} else if (qName.equals("name")) {
name = characters.toString().trim();
studentList.add(id + " = " + name);
}
characters.setLength(0);
} @Override
public void endDocument(String uri, String localName, String qName) throws SAXException { } }
}

测试文件:

<class>
<teacher>
<id>t01</id>
<name>SUN</name>
</teacher>
<teacher>
<id>t02</id>
<name>ZHANG</name>
</teacher>
<student>
<id>s01</id>
<name>Lucy</name>
</student>
<student>
<id>s02</id>
<name>Lili</name>
</student>
</class>

结果:

teacher:t01 = SUN
teacher:t02 = ZHANG
student:s01 = Lucy
student:s02 = Lili

补充:

可通过构造函数传入感兴趣的字段,“a,b,c,d”

补充(如果控制顺序):

import java.util.LinkedHashMap;
import java.util.Map; public class Main { public static void main(String[] args) {
Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("a", "1");
linkedHashMap.put("b", "2");
// 这里不改变原有顺序
linkedHashMap.put("a", "3"); System.out.println(linkedHashMap); } }
{a=3, b=2}

sax 动态切换 抓取感兴趣的内容(把element当做documnet 处理)的更多相关文章

  1. 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容

    背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...

  2. python网络爬虫-动态网页抓取(五)

    动态抓取的实例 在开始爬虫之前,我们需要了解一下Ajax(异步请求).它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新. 如果使用Ajax加载的动态网页抓取,有两种方法: 通过浏览器审查 ...

  3. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  4. 爬虫 - 动态分页抓取 游民星空 的资讯 - bs4

    # coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 动态分页抓取 游民星空 的资讯 date : 2018-08- ...

  5. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  6. C#抓取AJAX页面的内容

    原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...

  7. php抓取网页中的内容

    以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...

  8. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

  9. 面向初学者的Python爬虫程序教程之动态网页抓取

    目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...

随机推荐

  1. SpringMVC 启动流程

    首先看一下Web应用部署初始化过程 (Web Application Deployement),官方文档说明: Web Application Deployment When a web applic ...

  2. Python + Robot Framework 环境搭建

    一.Python 安装 说明:由于RIDE是基于python2.x开发,后期未做python3.x兼容,所以这里安装python2.7. 链接: https://pan.baidu.com/s/1yf ...

  3. JS stringObject.Match()

    JavaScript match() 方法 JavaScript String 对象 定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 inde ...

  4. Linux环境变量设置/etc/profile、/etc/bashrc、~/.profile、~/.bashrc区别

    登入系统读取步骤: 当登入系统时候获得一个shell进程时,其读取环境设定档有三步 : 1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/p ...

  5. 星级评分原理 N次重写的分析

    使用的是雪碧图,用的软件是CSS Sprite Tools 第一次实现与分析: <!DOCTYPE html> <html> <head> <meta cha ...

  6. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小

    本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类似Windows如下功能: 模块介绍: from ftplib import F ...

  7. IOS搜索框输入中文解决方案(防抖)

    class Header extends React.Component { constructor(props) { super(props); this.time = 0; // 重点在于这个th ...

  8. 29 _react-router说明

    一.SPA的理解 1.单页面web应用(single page web application ,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的链接不会刷新页面,本身也不会向服务器发请求 ...

  9. 【Noip模拟 20160929】划区灌溉

    题目描述 约翰的奶牛们发现山脊上的草特别美味.为了维持草的生长,约翰打算安装若干喷灌器. 为简化问题,山脊可以看成一维的数轴,长为L(1≤L≤1,000,000)L(1≤L≤1,000,000),而且 ...

  10. 把Gitlab迁移到Docker容器里

    把Gitlab迁移到Docker容器里 Apr 9, 2015. | By: 任怀林 公司的gitlab一直是运行在ovm的虚拟机里的,版本还是6.7.5.版本有点老了,最近在研究docker,于是想 ...