第九章 XML与其它数据文件的转换.docx
- 文档编号:26845903
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:29
- 大小:710.88KB
第九章 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;k Nodeemployee=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;k if(! 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;i flag[i]=false; } for(intk=0;k Nodenode=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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九章 XML与其它数据文件的转换 第九 XML 与其 数据文件 转换
![提示](https://static.bdocx.com/images/bang_tan.gif)