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加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
随机推荐
- 【转】java面试题
http://blog.csdn.net/jackfrued/article/details/44921941 Java面试题转
- sweetalert弹窗的使用
之前接触到layer弹出层,今天又发现了一个非常实用的弹出层插件,它的名字叫做sweetalert. 官网地址:http://t4t5.github.io/sweetalert/ npm下载方式:np ...
- linux redis 启动 overcommit_memory
Redis在启动时不成功, 查看日志发现如下警告: WARNING overcommit_memory is set to 0! Background save may fail under low ...
- !!!常用CSS代码块
图片排满一行.左右两端无间隙. <style type="text/css"> .img_abc{float:left;width:30%;margin-left:5% ...
- SOA和微服务的原则及对比
一.面向服务设计的原则 服务可复用:不管是否存在即时复用的机会,服务均被设计为支持潜在的可复用 服务共享一个标准契约:为了与服务提供者交互,消费者需要导入服务提供者的服务契约,这个契约可以是一个IDL ...
- 29 _react-router说明
一.SPA的理解 1.单页面web应用(single page web application ,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的链接不会刷新页面,本身也不会向服务器发请求 ...
- nexus的安装和简介(3)
从私服下载jar包 没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找jar,如果没有找到则连接私服从私服下载ja ...
- springboot @Value获取值为空,解决办法
在spring中,常常使用 @Value("${property}") 从application.properties中取值,需要注意两点 使用 @Value 的类不能使用 new ...
- Spark 基础之SQL 快速上手
知识点 SQL 基本概念 SQL Context 的生成和使用 1.6 版本新API:Datasets 常用 Spark SQL 数学和统计函数 SQL 语句 Spark DataFrame 文件保存 ...
- 大端&小端问题