第九章 XML与其它数据文件的转换.docx

上传人:b****4 文档编号:26845903 上传时间:2023-06-23 格式:DOCX 页数:29 大小:710.88KB
下载 相关 举报
第九章 XML与其它数据文件的转换.docx_第1页
第1页 / 共29页
第九章 XML与其它数据文件的转换.docx_第2页
第2页 / 共29页
第九章 XML与其它数据文件的转换.docx_第3页
第3页 / 共29页
第九章 XML与其它数据文件的转换.docx_第4页
第4页 / 共29页
第九章 XML与其它数据文件的转换.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

第九章 XML与其它数据文件的转换.docx

《第九章 XML与其它数据文件的转换.docx》由会员分享,可在线阅读,更多相关《第九章 XML与其它数据文件的转换.docx(29页珍藏版)》请在冰豆网上搜索。

第九章 XML与其它数据文件的转换.docx

第九章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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1