sax 动态切换 抓取感兴趣的内容(把element当做documnet 处理)
由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 处理)的更多相关文章
- 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容
背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...
- python网络爬虫-动态网页抓取(五)
动态抓取的实例 在开始爬虫之前,我们需要了解一下Ajax(异步请求).它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新. 如果使用Ajax加载的动态网页抓取,有两种方法: 通过浏览器审查 ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- 爬虫 - 动态分页抓取 游民星空 的资讯 - bs4
# coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 动态分页抓取 游民星空 的资讯 date : 2018-08- ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- C#抓取AJAX页面的内容
原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...
- php抓取网页中的内容
以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...
- 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别
背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...
- 面向初学者的Python爬虫程序教程之动态网页抓取
目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
随机推荐
- 杂谈3.py
bin() --------十转二 hex()------- 十转十六 oct()-------十转八 import math math.floor(数值)返回小于等于数值的整数 math.trunc ...
- k8s学习笔记之三:k8s快速入门
一.前言 kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver上实现各种增删改查等各种操作 kubectl官方使用文档:https://kubernetes.io ...
- 一个java使用redis的简单案例
这个例子中,java使用Jedis来操作Redis 1.引入Jedis的依赖 <dependency> <groupId>redis.clients</groupId&g ...
- LeetCode OJ 102. Binary Tree Level Order Traversal
题目 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to rig ...
- SQL(ORACLE)
查询数据库编码: select * from sys.nls_database_parameters;select * from sys.nls_session_parameters; replace ...
- 【原】The Linux Command Line - Workiing with commands
● type – Indicate how a command name is interpreted● which – Display which executable program will b ...
- 计算机系统的通信PPT版本
通信方式 并行传送:一次8位,需要保持各路信号同时到达,距离和速度受限制,成本较高 串行传送:一次1位,距离较远.速率更高,成本较低. {在单片机的通信中,使用的是串行传送,但是数据寄存器里面的是8位 ...
- C语言递归函数讲解
递归函数是什么? 是函数.................... 你可以把它理解成是for循环与死循环的结合的函数.简单的说:递归函数是有条件终止的死循环函数: 死循环函数这里是指在函数体中调用自身: ...
- 【Django】数据迁移问题
最近发现,Django在修改models之后重新生成迁移文件(这里可以生成),再进行数据库迁移的时候老是出错,查询数据库时老是找不到表格或者字段. 尝试过重新新建项目,新建一个同名APP,然后mode ...
- Laravel5 (cli)命令行执行脚本及定时任务
Artisan是Laravel自带的命令行接口名称,它提供了很多有用的命令想要查看所有可用的Artisan命令,可使用list命令查看: 1 php artisan list 每个命令都可以用help ...