第九章 XML与其它数据文件的转换.docx
《第九章 XML与其它数据文件的转换.docx》由会员分享,可在线阅读,更多相关《第九章 XML与其它数据文件的转换.docx(29页珍藏版)》请在冰豆网上搜索。
第九章XML与其它数据文件的转换
第九章XML与其它数据文件的转换
主要内容
Ø数据库到XML转换
ØXML到数据库转换
ØXML到Excel表转换
ØExcel表到XML转换
难点
ØXML到Excel表转换
ØExcel表到XML转换
XML文档是为Internet进行数据交换而设计的,在数据到达终点系统后,需要和系统中的各种数据联合工作;另外,XML文档存储数据是以文本的形式,可能存在安全性等问题。
所以XML文档和各种数据文件之间的转换就极为重要。
本章准备解决XML和常用数据的转换。
整体分两部分:
XML和数据库表的转换,XML和电子表格的转换。
9.1数据库表转换成XML文档
数据库是各种系统中存储数据的理想所在,另外,在数据管理等方面数据库有许多独到之处。
要想使XML融入各种系统中,进行它和数据库的转换甚为必要。
本节我们讨论数据库表到XML文档的转换。
需要强调的是,我们认为数据库表到XML文档的转换有特别的意义。
前面章节的内容中讲到许多构建XML文档的方法,坦率地讲,手工创建的XML文档不可能有多丰富,由数据库表转换能大大地改善这种状况。
作者认为这是产生XML文档的有效途径。
编程语言使用Java、解析XML使用DOM接口、数据库使用Access。
9.1.1建立数据库
单击Windows7系统桌面上的“开始”“所有程序”“MicrosoftOfficeAccess”启动数据库管理系统,点击新建数据库出现如图9.1所示界面。
图9.1新建数据库界面
将新建数据库命名为“员工信息数据库.mdb”,并点击创建。
9.1.2建立数据表
创建好数据库之后,就可以在该数据库中建立多个表。
打开“员工信息数据库.mdb”数据库在选择界面上选择“使用设计器创建表”后,单击“设计”,将出现创建表的界面。
使用该界面创建名字为“员工信息表”的表,并指定字段及其类型如图9.2所示。
图9.2新建表设计
录入表的各行数据,得到的样表如图9.3所示。
图9.3输入数据后的数据表
9.1.3建立ODBC数据源
选择“控制面板”“管理工具”“ODBC数据源”。
双击ODBC数据源图标,出现“ODBC数据源管理器”界面,如图9.4所示,该界面显示了已有的数据源名称。
图9.4数据源管理器
选择“用户DSN”,单击“添加”按钮,出现“创建数据源”界面,如图9.5所示。
图9.5创建新数据源
选择合适的驱动程序。
我们要访问Access数据表,选择“MicrosoftAccessDriver”。
单击完成按钮,将出现“ODBCMicrosoftAccess安装”界面,如图9.6所示。
图9.6ODBCMicrosoftAccess安装
为数据源起一个自己中意的名字,这里给出的是donghong。
这个数据源代表一个数据库。
单击界面上的“选择”按钮,选择前面建立的数据库“员工信息数据库.mdb”即可。
9.1.4将数据库表转换成XML文档
转换过程的Java处理程序如下。
importjavax.xml.transform.*;
importjavax.xml.transform.stream.*;
importjavax.xml.transform.dom.*;
importorg.w3c.dom.*;
importjavax.xml.parsers.*;
importjava.io.*;
importjava.sql.*;
publicclassDataBase_XML{
Connectioncon;
Statementsql;
ResultSetrs;
int[]number;
String[]name={""};
String[]gender={""};
int[]age;
String[]title={""};
float[]salary;
privatevoidconnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:
odbc:
donghong");
}
catch(ClassNotFoundExceptione){
System.out.println(""+e);
}
catch(SQLExceptione1){
System.out.println(""+e1);
}
}
privatevoidReadRecord(){
try{
sql=con.createStatement
(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery("SELECT*FROM员工信息表");
rs.last();
intrecordAmount=rs.getRow();
number=newint[recordAmount];
name=newString[recordAmount];
gender=newString[recordAmount];
age=newint[recordAmount];
title=newString[recordAmount];
salary=newfloat[recordAmount];
intk=0;
rs.beforeFirst();
while(rs.next()){
number[k]=rs.getInt
(1);
name[k]=rs.getString
(2);
gender[k]=rs.getString(3);
age[k]=rs.getInt(4);
title[k]=rs.getString(5);
salary[k]=rs.getFloat(6);
k++;
}
con.close();
}
catch(SQLExceptione){
System.out.println(e);
}
}
privatevoidcreateXML(){
try{DocumentBuilderFactoryfactory=
DocumentBuilderFactory.newInstance();
DocumentBuilderpaser=factory.newDocumentBuilder();
Documentdocument=paser.newDocument();
document.setXmlVersion("1.0");
Elementroot=document.createElement("员工信息表");
document.appendChild(root);
for(intk=0;kNodeemployee=document.createElement("员工");
root.appendChild(employee);
Nodehao=document.createElement("员工号");
hao.appendChild(document.createTextNode(Integer.toString(number[k])));
Nodexingming=document.createElement("姓名");
xingming.appendChild(document.createTextNode(name[k]));
Nodexingbie=document.createElement("性别");
xingbie.appendChild(document.createTextNode(gender[k]));
Nodenianling=document.createElement("年龄");
nianling.appendChild(document.createTextNode(Integer.toString(age[k])));
Nodezhiwu=document.createElement("职务");
zhiwu.appendChild(document.createTextNode(title[k]));
Nodepay=document.createElement("薪水");
pay.appendChild(document.createTextNode(Float.toString(salary[k])));
employee.appendChild(hao);
employee.appendChild(xingming);
employee.appendChild(xingbie);
employee.appendChild(nianling);
employee.appendChild(zhiwu);
employee.appendChild(pay);
}
TransformerFactorytransFactory=TransformerFactory.newInstance();
Transformertransformer=transFactory.newTransformer();
DOMSourcedomSource=newDOMSource(document);
Filef=newFile("newXML.xml");
FileOutputStreamout=newFileOutputStream(f);
StreamResultxmlResult=newStreamResult(out);
transformer.transform(domSource,xmlResult);
out.close();
}
catch(Exceptione){
System.out.println(e);
}
}
publicstaticvoidmain(String[]arg){
DataBase_XMLdata=newDataBase_XML();
data.connection();
data.ReadRecord();
data.createXML();
}
}
在Java开发环境中保存为DataBase_XML.java。
编译并运行,得到的XML文档在IE中显示的效果如图9.7所示。
图9.7由数据库表转换成的XML文档效果图
对Java程序作简单解释如下。
connection()方法完成数据库的连接,使用的是JDBC-ODBC桥接器。
ReadRecord()方法完成数据库表内容的读取。
“rs=sql.executeQuery("SELECT*FROM员工信息表");”查询员工信息表中的所有数据到结果集中,进而得到结果集的行数为存储结果的几个数组初始化,将结果中的第n行的每一列的值分别赋予对应数组的第n个元素。
createXML()方法完成XML文档的构建。
此方法其实是第七章DOM创建XML文档的扩展,数据的来源不再是程序中简单地给出,而是来自一个数据库。
9.2XML文档到数据库表的转换
本节我们讨论XML文档到数据库表的转换。
编程语言仍是Java、解析XML使用DOM接口、数据库使用Access。
9.2.1准备XML文档和数据库表
XML文档准备用上节生成的newXML.xml。
数据库也使用上节的库。
需要新建一个表“普通员工信息表”,各字段的定义复制“员工信息表”,数据内容为空。
9.2.2Java处理程序的编制
Java处理程序代码如下。
importorg.w3c.dom.*;
importjavax.xml.parsers.*;
importjava.io.*;
importjava.sql.*;
publicclassXML_DataBase{
Connectioncon;
Statementsql;
ResultSetrs;
int[]number;
String[]name={""};
String[]gender={""};
int[]age;
String[]title={""};
float[]salary;
boolean[]flag;
intrecordAmount;
privatevoidconnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:
odbc:
donghong");
}
catch(ClassNotFoundExceptione){
System.out.println(""+e);
}
catch(SQLExceptione1){
System.out.println(""+e1);
}
}
privatevoidWriteRecord(){
for(intk=0;kif(!
flag[k])continue;
try{
sql=con.createStatement();
StringinsertData="INSERTINTO普通员工信息表VALUES("+number[k]+",'"+name[k]+"','"+gender[k]+"',"+age[k]+",'"+title[k]+"',"+salary[k]+")";
sql.executeUpdate(insertData);
}
catch(SQLExceptione){
System.out.println(e);
}
}
try{
con.close();
}
catch(SQLExceptione){
System.out.println(e);
}
}
privatevoidReadXML(){
try{DocumentBuilderFactoryfactory=
DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdocument=builder.parse(newFile("newXML.xml"));
Elementroot=document.getDocumentElement();
StringrootName=root.getNodeName();
NodeListnodelist=root.getElementsByTagName("员工");
recordAmount=nodelist.getLength();
number=newint[recordAmount];
name=newString[recordAmount];
gender=newString[recordAmount];
age=newint[recordAmount];
title=newString[recordAmount];
salary=newfloat[recordAmount];
flag=newboolean[recordAmount];
for(inti=0;iflag[i]=false;
}
for(intk=0;kNodenode=nodelist.item(k);
if(node.getNodeType()==Node.ELEMENT_NODE){
Elementelement=(Element)node;
NodeListlist=element.getChildNodes();
intshu=list.getLength();
for(intm=shu-1;m>=0;m--){
Nodejiedian=list.item(m);
Elementele=(Element)jiedian;
if(m==shu-1&&Float.parseFloat(ele.getTextContent())>5000)
break;
flag[k]=true;
switch(m){
case0:
number[k]=Integer.parseInt(ele.getTextContent());break;
case1:
name[k]=ele.getTextContent();break;
case2:
gender[k]=ele.getTextContent();break;
case3:
age[k]=Integer.parseInt(ele.getTextContent());break;
case4:
title[k]=ele.getTextContent();break;
case5:
salary[k]=Float.parseFloat(ele.getTextContent());break;
}
}
}
}
}
catch(Exceptione){
System.out.println(e);
}
}
publicstaticvoidmain(String[]arg){
XML_DataBasedata=newXML_DataBase();
data.connection();
data.ReadXML();
data.WriteRecord();
}
}
在Java开发环境中保存文件为XML_DataBase.java,编译并运行,得到的新Access表如图9.8所示。
图9.8由XML文档生成的Access表
程序关键内容解读如下:
ReadXML()方法负责读取XML文档中的数据。
此处对需要的数据进行了一个简单的筛选,月薪少于5000的人员信息被读取出来。
为此用到了标志flag表示是否符合要求,用到了break语句跳出循环。
读取到的XML文档中的第n个员工的信息分别放入6个数组的第n个元素中。
connection()方法负责连接数据库,同上例。
WriteRecord()方法负责把符合要求的数据写入规定的表中。
使用的是常用的SQL的INSERTINTO语句,无须赘述。
9.3XML文档到Excel表的转换
前已述及,XML要想融入各种系统中,与多种格式文档进行转换非常必要。
Excel表以简单实用、功能强大,受到越来越多人士的欢迎,尤其是从事实际工程人员的喜爱。
本节要讲解XML与Excel表之间的转换。
由于要对Excel表进行操作,为此对操作工具进行简单介绍。
9.3.1ApachePOI及其类库的配置
ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对MicrosoftOffice格式档案读和写的功能。
其结构如下:
HSSF-提供读写MicrosoftExcel格式档案的功能。
XSSF-提供读写MicrosoftExcelOOXML格式档案的功能。
HWPF-提供读写MicrosoftWord格式档案的功能。
HSLF-提供读写MicrosoftPowerPoint格式档案的功能。
HDGF-提供读写MicrosoftVisio格式档案的功能。
在此处,我们只用到了它的HSSF类。
首先,从http:
//poi.apache.org/download.html上下载最新的POI类库,将其解压的包中的“poi-bin-3.7-20101029”这个jar包放入自己认为方便的位置。
在开发环境中将这个jar包加入进来才可以使用,我使用的开发环境是Eclipse。
在EclipseIDE的左边栏的PackageEexplorer栏内的ReferencedLibraries项上右键点击弹出菜单,点击BuildPathConfigurateBuildPath弹出界面如图9.9所示。
图9.9外部包的加入
在Libraries标签中单击“AddExternalJARs”,将存放POI的路径指定即可。
9.3.2XML文档到Excel表转换设计
以实例说明设计过程。
所需XML文档使用9.1中生成的newXML.xml文件,Java处理程序代码如下。
importjava.io.File;
importjava.io.FileOutputStream;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.apache.poi.hssf.usermodel.HSSFCell;
importorg.apache.poi.hssf.usermodel.HSSFRow;
importorg.apache.poi.hssf.usermodel.HSSFSheet;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
publicclassXML_Excel{
int[]number;
String[]name={""};
String[]gender={""};
int[]age;
String[]title={""};
float[]salary;
boolean[]flag;
intrecordAmount;
publicstaticStringoutputFile="D:
/JTest/gongye.xls";
String[]head={"员工号","姓名","性别","年龄","职务","月薪"};
privatevoidReadXML(){
try{DocumentBuilderFacto