网络编程设计报告
题 目:DBLP数据解析并存入数据库 学 院: 电子通信与物理学院 专 业: 电子与通信工程 班 级: 组 长: 关 学 号:151 组 员: 刘 学 号:1513310 组 员: 赵 学 号:1513310
时 间: 2016 年 7月 5 日
1.设计需求分析
随着 Internet的迅猛发展 , 网络应用的范围和领域也越来越广,各企业、部门、团体以及个人都在以不同的方式、不同的介质、不同的操作系统和平台加入到Internet中去。网络间的信息交互和数据交换也急剧猛增,其数据量和数据结构的复杂度也都相应提高,使得作为传统的超文本标记语言的HTML由于其自身固定语法的局限性已经不能够满足信息交互和数据交换的需求。因此从1996年开始,W3C(World Wide Web Consortium) 开始发展一种全新的可扩展标记语言XML(Extensible Markup Language),并于1998年2月正式发布XML1.0版本。由于XML所具有的优点和特性,现在它已经成为发展网络的一项关键技术,并成为网络信息交互和数据交换的一种标准和格式。
2.设计背景 1.1 DBLP概述
DBLP(DataBase systems and Logic Programming)是计算机领域内对研究的
成果以作者为核心的一个计算机类英文文献的集成数据库系统,按年代列出了作者的科研成果。包括国际期刊和会议等公开发表的论文。DBLP没有提供对中文文献的收录和检索功能,国内类似的权威期刊及重要会议论文集成检索系统有C-DBLP。
这个项目是德国特里尔大学的Michael Ley负责开发和维护。它提供计算机领域科学文献的搜索服务,但只储存这些文献的相关元数据,如标题,作者,发表日期等。和一般流行的情况不同,DBLP并没有使用数据库而是使用XML存储元数据。
DBLP在学术界声誉很高,而且很多论文及实验都是基于DBLP的。所收录的期刊和会议论文质量较高,也比较全面。文献更新速度很快,能很好地反应了国外学术研究的前沿方向。 1.2 XML概述
XML(Extensible Markup Language)是可扩展标记语言,可扩展标记语言是一种元标记语言,即定义了用于定义其他特定领域有关语义的、结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识。XML 文档定义方式有:文档类型定义(DTD)和XML Schema。DTD定义了文档的整体结构
以及文档的语法,应用广泛并有丰富工具支持。XML Schema用于定义管理信息等更强大、更丰富的特征。XML能够更精确地声明内容,方便跨越多种平台的更有意义的搜索结果。它提供了一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码、数据和表示分离,并作为数据交换的标准格式,因此它常被称为智能数据文档。
XML文档格式的管理信息可以很容易地通过HTTP 协议传输,由于HTTP是建立在TCP之上的,故管理数据能够可靠传输。XML还支持访问XML文档的标准API,如DOM,SAX,XSLT,Xpath等。
XML能够以灵活有效的方式定义管理信息的结构。以XML格式存储的数据不仅有良好的内在结构,而且由于它是W3C提出的国际标准,因而受到广大软件提供商的支持,易于进行数据交流和开发。现有网络管理标准如TMN、SNMP等的管理信息库规范决定了网管数据符合层次结构和面向对象原则,这使得以XML格式存储网管数据也非常自然,易于实现。
只要定义一套描述各项管理数据和管理功能的XML语言,用Schema对这套语言进行规定,并且共享这些数据的系统的XML文档遵从这些Schema,那么管理数据和管理功能就可以在多个应用系统之间共享和交互。
XML能方便有效地表示结构化数据,这就使得XML可以作为描述和传输数据的手段。使用XML进行数据交换已经成为计算机软件领域的标准技术模式。通过XML实现数据的标准化、结构化,解决了在不同平台、不同系统之间的数据结构/模式的差异,使得数据层在XML技术的支持下统一起来。
3.用JAVA对XML解析
3.1 JAVA和XML
Java作为一种与底层硬件和操作系统无关、“ 编写一次,到处运行” 的特
性风靡全球,成为适应于Internet的新一代网络编程语言,Java技术和XML有着许多共性和互补的特性:
( 1) Java和XML固有地支持Unicode标准,这样Java与XML文档之间的交互就非常简单,而不需在二者之间再进行字符格式的转换,提高了Java对XML 文档处理的时间。
( 2 ) 技术绑定了W3C的文档对象模型(DOM,Document Object Model), 从
而为开发者处理和查询XML文档提供了一个高效的环境。Java平台有可能成为处理XML文档的一个最普遍的应用环境。
( 3 ) Java平台严格地支持面向对象的编程方式,使得开发者可以创建层次结构的Java对象。XML同样也可以指定数据结构的层次描述。因此,二者之间的结构可以进行相互描述,兼容性很强。
( 4 ) 用Java语言编写的处理XML文档的应用程序可以在多层客户机/服务器任意层中重新使用,给XML文档的重新利用提供了一个附加层。
Java与XML的共性和诸多互补性,使得在诸如电子商务和企业应用集成这样领域的新一代Web 应用成为可能。Java技术也成了使用XML语言工作的开发人员的首选技术,有很多解析器和通用工具都是在Java平台上开发的,因为Java语言不仅具有移植性和吸引人的面向对象的特性,而且具有很高的效率。下面将利用Java技术针对XML文档进行分析和研究。 3.2 用JAVA对XML文档的分析
作为一种文档格式,同其他的数据格式一样,XML文档和DT D 创建之后,应用程序就必须对其进行处理:读取XML文档并介人其数据结构和内容。这个过程可用图l 来表示:
XML文档经解析器处理之后,所有的元素、属性、实体和符号都作为对象提供给应用程序操作、参考或显示其内容。这里我们利用Sax解析器,采用Java语言来实现对一XML文档的读取和处理。
XML文档 XML应用程序 XML对象 元素 XML解析属性 实体 XML应用程序 DTD 数据库
图1 XML文档的解析
3.2.1 SAX解析器
本设计采用的是SAX解析器。SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。
SAX,它既是一个接口,也是一个软件包.但作为接口,SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX都会产生以下类型的事件: (1)在文档的开始和结束时触发文档处理事件。
(2)在文档内每一XML元素接受解析的前后触发元素事件。 (3)任何元数据通常由单独的事件处理
(4)在处理文档的DTD或Schema时产生DTD或Schema事件。 (5)产生错误事件用来通知主机应用程序解析错误。 举例来说对于一个XML文档的其解析的过程为: Xml文档:
New DefaultHandler 应用程序 文档处理程序 startDocument Parser() 解析器 startElement characters endElement endDocument
图2 SAX解析器处理程序流程
3.2.2 MySQL数据库
本设计采用MySQL数据库对解析出来的数据进行存储。MySQL是一个关系
型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL 自有
它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。
本设计的数据库建表时属性和类型如下:
首先创建数据库dblp,在数据库dblp中创建列表如下:
各表的结构如下:
4.设计结果
本设计解析了1.7G的xml文件,用时3701s,程序在运行过程中出现了一些事件,并没有出现错误。解析过程中向数据库中存储了上百万条信息。本设计将xml文件中的会议、引用、论文分别存储于MySQL数据库中的dblp数据库的相应表中。
结果如下图所示:
图3 运行结果,用时及出现事件
图4 表author存储结果
图5 表citation存储结果
图6 表conference存储结果
图7 表paper存储结果
本设计实现了对XML文件的解析,并将解析出的数据存储到MySQL数据
库中,存储的数据有上百万条。
附录 设计源程序在随报告一起的文件中
附录 部分源程序
******解析程序Parser .java******
import java.io.*;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;
import javax.xml.parsers.*; import org.xml.sax.*;
import org.xml.sax.helpers.*;
import db.DBConnection;
public class Parser {
if (ancestor == Element.INPROCEEDING) {
private Connection conn; private int curElement = -1; private int ancestor = -1; private Paper paper; private Conference conf; int line = 0;
PreparedStatement stmt_inproc, stmt_conf, stmt_author, stmt_cite; int errors = 0; StringBuffer author;
private class ConfigHandler extends DefaultHandler {
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts) throws SAXException { ancestor = Element.INPROCEEDING; curElement = Paper.INPROCEEDING; paper = new Paper();
paper.key = atts.getValue(\"key\"); ancestor = Element.PROCEEDING; curElement = Conference.PROCEEDING; conf = new Conference();
conf.key = atts.getValue(\"key\"); if (rawName.equals(\"inproceedings\")) {
} else if (rawName.equals(\"proceedings\")) {
} else if (rawName.equals(\"author\") && ancestor == }
author = new StringBuffer();
Element.INPROCEEDING) {
{
}
}
curElement = Paper.getElement(rawName); curElement = Conference.getElement(rawName); ancestor = Element.OTHER; curElement = Element.OTHER; curElement = Element.OTHER;
} else if (ancestor == Element.PROCEEDING) { } else if (ancestor == -1) {
} else {
line++;
public void characters(char[] ch, int start, int length) }
public void endElement(String namespaceURI, String localName,
String rawName) throws SAXException {
if (rawName.equals(\"author\") && ancestor == Element.INPROCEEDING) }
paper.authors.add(author.toString().trim()); }
throws SAXException {
String str = new String(ch, start, length).trim(); if (curElement == Paper.AUTHOR) { }
String str = new String(ch, start, length).trim(); if (curElement == Conference.CONFNAME) { }
conf.name = str; conf.detail = str;
} else if (curElement == Conference.CONFDETAIL) {
author.append(str); paper.citations.add(str); paper.conference = str; paper.title += str;
paper.year = Integer.parseInt(str); } else if (curElement == Paper.CITE) { } else if (curElement == Paper.CONFERENCE) { } else if (curElement == Paper.TITLE) { } else if (curElement == Paper.YEAR) { if (ancestor == Element.INPROCEEDING) {
} else if (ancestor == Element.PROCEEDING) {
if (Element.getElement(rawName) == Element.INPROCEEDING) {
ancestor = -1; try { }
ancestor = -1; try {
if (conf.name.equals(\"\")) }
stmt_conf.setString(1, conf.key);
conf.name = conf.detail;
|| conf.detail.equals(\"\")) {
if (conf.key.equals(\"\") || conf.name.equals(\"\")
System.out.println(\"Line:\" + line); System.exit(0);
if (paper.title.equals(\"\") || paper.conference.equals(\"\") }
stmt_inproc.setString(1, paper.title); stmt_inproc.setInt(2, paper.year);
stmt_inproc.setString(3, paper.conference); stmt_inproc.setString(4, paper.key); stmt_inproc.addBatch();
for (String author: paper.authors) { }
for (String cited: paper.citations) { }
e.printStackTrace();
System.out.println(\"line:\" + line); System.exit(0);
if (!cited.equals(\"...\")) { }
stmt_cite.setString(1, paper.key); stmt_cite.setString(2, cited); stmt_cite.addBatch();
stmt_author.setString(1, author); stmt_author.setString(2, paper.key); stmt_author.addBatch();
|| paper.year == 0) {
System.out.println(\"Error in parsing \" + paper); errors++; return;
} catch (SQLException e) {
} else if (Element.getElement(rawName) == Element.PROCEEDING) {
{
}
}
}
stmt_conf.setString(2, conf.name); stmt_conf.setString(3, conf.detail); stmt_conf.addBatch(); e.printStackTrace();
System.out.println(\"line:\" + line); System.exit(0);
} catch (SQLException e) {
if (line % 10000 == 0) { }
try { }
stmt_inproc.executeBatch(); stmt_conf.executeBatch(); stmt_author.executeBatch(); stmt_cite.executeBatch(); conn.commit();
//System.out.println(\"Processing \" + line); System.err.println(e.getMessage());
} catch (SQLException e) {
private void Message(String mode, SAXParseException exception) { }
public void warning(SAXParseException exception) throws SAXException }
public void error(SAXParseException exception) throws SAXException { }
public void fatalError(SAXParseException exception) throws
Message(\"**Parsing Fatal Error**\\n\", exception); Message(\"**Parsing Error**\\n\", exception); throw new SAXException(\"Error encountered\"); Message(\"**Parsing Warning**\\n\", exception); throw new SAXException(\"Warning encountered\");
System.out.println(mode + \" Line: \" + exception.getLineNumber()
+ \" URI: \" + exception.getSystemId() + \"\\n\" + \" Message: \" + exception.getMessage());
SAXException {
}
}
throw new SAXException(\"Fatal Error encountered\");
Parser(String uri) throws SQLException {
try {
System.out.println(\"Parsing...\"); conn = DBConnection.getConn(); conn.setAutoCommit(false); stmt_inproc = conn
.prepareStatement(\"insert into
paper(title,year,conference,paper_key) values (?,?,?,?)\");
stmt_author = conn
.prepareStatement(\"insert into author(name,paper_key)
values (?,?)\");
stmt_cite = conn
.prepareStatement(\"insert into
citation(paper_cite_key,paper_cited_key) values (?,?)\");
stmt_conf = conn
.prepareStatement(\"insert into
conference(conf_key,name,detail) values (?,?,?)\");
SAXParserFactory parserFactory = SAXParserFactory.newInstance(); SAXParser parser = parserFactory.newSAXParser(); ConfigHandler handler = new ConfigHandler(); parser.getXMLReader().setFeature( try { }
conn.close();
System.out.println(\"num of errors: \" + errors);
stmt_inproc.executeBatch(); stmt_conf.executeBatch(); stmt_author.executeBatch(); stmt_cite.executeBatch(); conn.commit();
System.out.println(\"Processed \" + line); e.printStackTrace();
\"http://xml.org/sax/features/validation\", true);
parser.parse(\"dblp.xml\", handler);
} catch (SQLException e) {
}
}
} catch (IOException e) { }
System.out.println(\"Error reading URI: \" + e.getMessage()); System.out.println(\"Error in parsing: \" + e.getMessage()); System.out.println(\"Error in XML parser configuration: \"
+ e.getMessage());
} catch (SAXException e) {
} catch (ParserConfigurationException e) {
public static void main(String[] args) throws SQLException, }
ClassNotFoundException { args=new String[3];
Long start = System.currentTimeMillis(); Parser p = new Parser(args[0]); Long end = System.currentTimeMillis();
System.out.println(\"Used: \" + (end - start) / 1000 + \" seconds\");
****** Paper .java******
import java.util.ArrayList;
public class Paper {
public String toString(){ }
return \"title: \" + title + \" authors: \" + authors.toString() +
\" conference: \" + conference + \" year: \" + year + \" key: \" + key;
public static final int OTHER = 0; public static final int INPROCEEDING = 1; public static final int AUTHOR = 2; public static final int TITLE = 3; public static final int YEAR = 4; public static final int CITE = 5; public static final int CONFERENCE = 6; public String key; public String title; public int year;
public String conference;
public ArrayList public static int getElement(String name) { } public static String getElementName(int i) { } public Paper() { key = \"\"; title = \"\"; conference = \"\"; year = 0; authors = new ArrayList return \"inproceedings\"; return \"author\"; return \"name\"; return \"year\"; return \"cite\"; return \"booktitle\"; return \"other\"; } else if (i == AUTHOR) { } else if (i == TITLE) { } else if (i == YEAR) { } else if (i == CITE) { } else if (i == CONFERENCE) { } else { if (name.equals(\"inproceedings\")) { return INPROCEEDING; return AUTHOR; } else if (name.equals(\"author\")) { } else if (name.equals(\"title\") || name.equals(\"sub\") || } return TITLE; return YEAR; return CITE; return CONFERENCE; return OTHER; name.equals(\"sup\") || name.equals(\"i\")||name.equals(\"tt\")) { } else if (name.equals(\"year\")) { } else if (name.equals(\"cite\")) { } else if (name.equals(\"booktitle\")) { } else { } } ******与数据库连接程序DBConnection .java****** import java.sql.*; public class DBConnection { } public static Connection getConn() { } try { } Class.forName(\"org.gjt.mm.mysql.Driver\"); return DriverManager.getConnection(dbUrl, user, password); System.out.println(\"Error while opening a conneciton to database + e.getMessage()); // Change the parameters accordingly. private static String dbUrl = private static String user = \"root\"; private static String password = \"minmin\"; \"jdbc:mysql://127.0.0.1:3306/dblp?useUnicode=true&characterEncoding=utf-8\"; } catch (Exception e) { server: \" return null; 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务