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加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
随机推荐
- Web项目中得到访问者的真实ip
Web项目中得到访问者的真实ip 描述:最近要实现个功能是要记录管理员登录的真实ip,但在项目中如果直接使用request.getRemoteAddr()获得ip的话,获得的可能不是真实ip,是因为使 ...
- MySQL查询当天、本周、本月数据语句
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...
- 部署一个基于python语言的web发布环境
---恢复内容开始--- 1) 一门面向对象的语言 2)拥有丰富的库 3)可移植性 4)免费.开源 5)简单易易学 可做软件开发.人工智能.web开发等等 部署流程: Cnetos7.5+Nginx+ ...
- ansible 问题
如下图,A服务器上用普通账号ansible有时就会报错,但有时却又正常,可以连接成功,用root账号执行ansible就完全没问题. 仅仅是这一台服务器有问题,其他都完全正常..ansible 文件删 ...
- Python函数定义和使用
函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...
- python入门 -- 学习笔记1
学习资料:笨方法学Python 准备: 安装环境----请自行网络搜索(Windows安装很简单,和其他安装程序一样) 找一个自己习惯的编辑器(比如:sublime text 3) 创建一个专门的目录 ...
- Pandas重塑和轴向旋转
重塑和轴向旋转 Se import pandas as pd import numpy as np from pandas import Series data=pd.DataFrame(np.ara ...
- ELK填坑总结和优化过程
做了几周的测试,踩了无数的坑,总结一下,全是干货,给大家分享~ 一.elk 实用知识点总结 1.编码转换问题(主要就是中文乱码) (1)input 中的codec => plain 转码 cod ...
- xcode项目打不开:incompatible project version问题
低版本xcode打开高版本xcode项目或库工程的时候就会出现,打不开的问题 解决 1可以重建创建工程,将文件拷贝到新工程 2 相对一,较简单 找到.xcodeproj文件 右键 显示包内容,找到pr ...
- ES6 Number
1. 新增Number.EPSILON(误差检查函数)