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加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
随机推荐
- Kafka命令操作
本文主要介绍Kafka的shell命令: 查看当前服务器所有的topic [hadoop@datanode1 kafka]$ bin/kafka-topics.sh --zookeeper datan ...
- git打tag
亲们支持我的新博客哦==>地址(以后更新会尽量在新博客更新,欢迎大家访问加入我的后宫w) ) 标签分类 git标签分为两种类型:轻量标签和附注标签.轻量标签是指向提交对象的引用,附注标签 ...
- python 修改dataframe的列名
1. 修改全部列名 df.columns base_data_model.columns = [u'有效率',u'提交率',u'参与度',u'回放占比',u'主好评率',u'辅好评率',u'是否付费' ...
- python大法好——模块(内置模块未完)
模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块. Python模块有什么作用? 1.模块内有许多函数方法,利用这些方法可以更简单的完成许多工作.2.模块 ...
- Python字符串格式化 (%操作符)
在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...
- intllij IDE 中git ignore 无法删除target目录下的文件
原因: git的本地忽略设置必须保证git的远程仓库分支上没有这个要忽略的文件,如果远程分支上存在这个文件,本地在设置ignore 这个文件,将会失败,无法commit忽略.(有人说是git的bug, ...
- leetcode85
class Solution { public int maximalRectangle(char[][] matrix) { if(matrix == null || matrix.length = ...
- Itellj Idea使用技巧
模板设置: 类模板:File–>Settings–>Editor–>File and Code Templates–>Includes–>File Header 输入缩写 ...
- BerOS File Suggestion(字符串匹配map)
BerOS File Suggestion(stl-map应用) Polycarp is working on a new operating system called BerOS. He asks ...
- unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
var arr = [1, 2]; arr.unshift(0); //result of call is 3, the new array length //arr is [0, 1, 2] arr ...