在java中,可以用多种方式处理xml文件。前一段时间因为要使用到dblp数据集,而且这个数据集比较大无法一次性加载到内存中解析成文档树再处理。所以只能用sax的方式边读边处理。
下面是dblp数据集的简介,在处理xml文件之前,对xml的结构的了解很重要:
DBLP是计算机领域内对研究的成果以作者为核心的一个计算机类英文文献的集成数据库系统,按年代列出了作者的科研成果。包括国际期刊和会议等公开发表的论文。DBLP没有提供对中文文献的收录和检索功能,国内类似的权威期刊及重要会议论文集成检索系统有C-DBLP。
这个项目是德国特里尔大学的Michael Ley负责开发和维护。它提供计算机领域科学文献的搜索服务,但只储存这些文献的相关元数据,如标题,作者,发表日期等。和一般流行的情况不同,DBLP并没有使用数据库而是使用XML存储元数据。
DBLP在学术界声誉很高,而且很多论文及实验都是基于DBLP的。所收录的期刊和会议论文质量较高,也比较全面。文献更新速度很快,能很好地反应了国外学术研究的前沿方向。
在下载DBLP数据集后要记得下载dblp.dtd文件,这个文件是对数据集结构的说明:
数据集的根节点是: dblp 二级节点有:article|inproceedings|proceedings|book|incollection|phdthesis|mastersthesis|www 这些节点标识了文献的类型。三级节点有:booktitle ,pages,year。。。。等等,分别标识文献的题目/页数/年份等属性。
我的解析目标是将这个xml文件的数据集解析出来存储到关系型数据库中,比如mysql。
下面简单介绍一下如何再java用sax的方式解析xml文档:
主要需要写一个类继承 org.xml.sax.helpers.DefaultHandler(注意这里并非实现接口)
重写如下方法,这里对方法的作用也进行了说明:
/*用来遍历xml的开始标签
参数说明:
uri:标签的命名空间uri,如果标签没有命名空间或者不需要命名空间处理,则为空值
localName:本地名,不需要命名空间处理则为空
qName:当前遍历的标签名
attributes:标签的属性,可以为空
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
}
//用来遍历xml的结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
}
/*
获取标签中间的字符数据。比如对于节点<year>1991</year>获取的即为1991
ch:字符数据(以字符数组的形式)
start:字符数组中的起始位置
length:从起始位置开