第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換_第1頁
第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換_第2頁
第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換_第3頁
第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換_第4頁
第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第九章 XML與其它數(shù)據(jù)文件的轉(zhuǎn)換主要內(nèi)容Ø 數(shù)據(jù)庫到XML轉(zhuǎn)換Ø XML到數(shù)據(jù)庫轉(zhuǎn)換Ø XML到Excel表轉(zhuǎn)換Ø Excel表到XML轉(zhuǎn)換難點(diǎn)Ø XML到Excel表轉(zhuǎn)換Ø Excel表到XML轉(zhuǎn)換XML文檔是為Internet進(jìn)行數(shù)據(jù)交換而設(shè)計(jì)的,在數(shù)據(jù)到達(dá)終點(diǎn)系統(tǒng)后,需要和系統(tǒng)中的各種數(shù)據(jù)聯(lián)合工作;另外,XML文檔存儲數(shù)據(jù)是以文本的形式,可能存在安全性等問題。所以XML文檔和各種數(shù)據(jù)文件之間的轉(zhuǎn)換就極為重要。本章準(zhǔn)備解決XML和常用數(shù)據(jù)的轉(zhuǎn)換。整體分兩部分:XML和數(shù)據(jù)庫表的轉(zhuǎn)換,XML和電子表格的轉(zhuǎn)換。9.1 數(shù)據(jù)庫表轉(zhuǎn)換成

2、XML文檔數(shù)據(jù)庫是各種系統(tǒng)中存儲數(shù)據(jù)的理想所在,另外,在數(shù)據(jù)管理等方面數(shù)據(jù)庫有許多獨(dú)到之處。要想使XML融入各種系統(tǒng)中,進(jìn)行它和數(shù)據(jù)庫的轉(zhuǎn)換甚為必要。本節(jié)我們討論數(shù)據(jù)庫表到XML文檔的轉(zhuǎn)換。需要強(qiáng)調(diào)的是,我們認(rèn)為數(shù)據(jù)庫表到XML文檔的轉(zhuǎn)換有特別的意義。前面章節(jié)的內(nèi)容中講到許多構(gòu)建XML文檔的方法,坦率地講,手工創(chuàng)建的XML文檔不可能有多豐富,由數(shù)據(jù)庫表轉(zhuǎn)換能大大地改善這種狀況。作者認(rèn)為這是產(chǎn)生XML文檔的有效途徑。編程語言使用Java、解析XML使用DOM接口、數(shù)據(jù)庫使用Access。9.1.1 建立數(shù)據(jù)庫 單擊Windows 7系統(tǒng)桌面上的“開始”à“所有程序”à “Mi

3、crosoft Office Access”啟動(dòng)數(shù)據(jù)庫管理系統(tǒng),點(diǎn)擊新建數(shù)據(jù)庫出現(xiàn)如圖9.1所示界面。圖9.1 新建數(shù)據(jù)庫界面將新建數(shù)據(jù)庫命名為“員工信息數(shù)據(jù)庫.mdb”,并點(diǎn)擊創(chuàng)建。9.1.2 建立數(shù)據(jù)表 創(chuàng)建好數(shù)據(jù)庫之后,就可以在該數(shù)據(jù)庫中建立多個(gè)表。打開“員工信息數(shù)據(jù)庫.mdb”數(shù)據(jù)庫在選擇界面上選擇“使用設(shè)計(jì)器創(chuàng)建表”后,單擊“設(shè)計(jì)”,將出現(xiàn)創(chuàng)建表的界面。使用該界面創(chuàng)建名字為“員工信息表”的表,并指定字段及其類型如圖9.2所示。圖9.2 新建表設(shè)計(jì)錄入表的各行數(shù)據(jù),得到的樣表如圖9.3所示。圖9.3 輸入數(shù)據(jù)后的數(shù)據(jù)表9.1.3 建立ODBC數(shù)據(jù)源 選擇“控制面板”à “管理

4、工具”à “ODBC數(shù)據(jù)源”。雙擊ODBC數(shù)據(jù)源圖標(biāo),出現(xiàn)“ODBC數(shù)據(jù)源管理器”界面,如圖9.4所示,該界面顯示了已有的數(shù)據(jù)源名稱。圖9.4 數(shù)據(jù)源管理器選擇“用戶DSN”,單擊“添加”按鈕,出現(xiàn)“創(chuàng)建數(shù)據(jù)源”界面,如圖9.5所示。圖9.5 創(chuàng)建新數(shù)據(jù)源選擇合適的驅(qū)動(dòng)程序。我們要訪問Access數(shù)據(jù)表,選擇“Microsoft Access Driver”。單擊完成按鈕,將出現(xiàn)“ODBC Microsoft Access安裝”界面,如圖9.6所示。圖9.6 ODBC Microsoft Access安裝為數(shù)據(jù)源起一個(gè)自己中意的名字,這里給出的是donghong。這個(gè)數(shù)據(jù)源代表一個(gè)數(shù)

5、據(jù)庫。單擊界面上的“選擇”按鈕,選擇前面建立的數(shù)據(jù)庫“員工信息數(shù)據(jù)庫.mdb”即可。9.1.4 將數(shù)據(jù)庫表轉(zhuǎn)換成XML文檔 轉(zhuǎn)換過程的Java處理程序如下。import javax.xml.transform.*;import javax.xml.transform.stream.*;import javax.xml.transform.dom.*;import org.w3c.dom.*; import javax.xml.parsers.*;import java.io.*;import java.sql.*;public class DataBase_XML Connection con

6、; Statement sql; ResultSet rs; int number; String name="" String gender="" int age; String title="" float salary; private void connection() try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection("jdbc:odbc:donghong"); catc

7、h(ClassNotFoundException e) System.out.println(""+e); catch(SQLException e1) System.out.println(""+e1); private void ReadRecord() try sql=con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); rs=sql.executeQuery("SELECT * FROM 員工信息表"); rs.las

8、t(); int recordAmount=rs.getRow(); number=new intrecordAmount; name=new StringrecordAmount; gender=new StringrecordAmount; age=new intrecordAmount; title=new StringrecordAmount; salary=new floatrecordAmount; int k=0; rs.beforeFirst(); while(rs.next() numberk=rs.getInt(1); namek=rs.getString(2); gend

9、erk=rs.getString(3); agek=rs.getInt(4); titlek=rs.getString(5); salaryk=rs.getFloat(6); k+; con.close(); catch(SQLException e) System.out.println(e); private void createXML() try DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder paser=factory.newDocumentBuilder();

10、 Document document=paser.newDocument(); document.setXmlVersion("1.0"); Element root=document.createElement("員工信息表"); document.appendChild(root); for(int k=0;k<name.length;k+) Node employee=document.createElement("員工"); root.appendChild(employee); Node hao=document.cr

11、eateElement("員工號"); hao.appendChild(document.createTextNode(Integer.toString(numberk); Node xingming=document.createElement("姓名"); xingming.appendChild(document.createTextNode(namek); Node xingbie=document.createElement("性別"); xingbie.appendChild(document.createTextNode

12、(genderk); Node nianling=document.createElement("年齡"); nianling.appendChild(document.createTextNode(Integer.toString(agek); Node zhiwu=document.createElement("職務(wù)"); zhiwu.appendChild(document.createTextNode(titlek); Node pay=document.createElement("薪水"); pay.appendChild

13、(document.createTextNode(Float.toString(salaryk); employee.appendChild(hao); employee.appendChild(xingming); employee.appendChild(xingbie); employee.appendChild(nianling); employee.appendChild(zhiwu); employee.appendChild(pay); TransformerFactory transFactory=TransformerFactory.newInstance(); Transf

14、ormer transformer=transFactory.newTransformer(); DOMSource domSource=new DOMSource(document); File f=new File("newXML.xml"); FileOutputStream out=new FileOutputStream(f); StreamResult xmlResult=new StreamResult(out); transformer.transform(domSource,xmlResult); out.close(); catch(Exception

15、e) System.out.println(e); public static void main(String arg) DataBase_XML data=new DataBase_XML(); data.connection(); data.ReadRecord(); data.createXML(); 在Java開發(fā)環(huán)境中保存為DataBase_XML.java。編譯并運(yùn)行,得到的XML文檔在IE中顯示的效果如圖9.7所示。圖9.7 由數(shù)據(jù)庫表轉(zhuǎn)換成的XML文檔效果圖 對Java程序作簡單解釋如下。 connection()方法完成數(shù)據(jù)庫的連接,使用的是JDBC-ODBC橋接器。 Re

16、adRecord()方法完成數(shù)據(jù)庫表內(nèi)容的讀取。“rs=sql.executeQuery("SELECT * FROM 員工信息表");”查詢員工信息表中的所有數(shù)據(jù)到結(jié)果集中,進(jìn)而得到結(jié)果集的行數(shù)為存儲結(jié)果的幾個(gè)數(shù)組初始化,將結(jié)果中的第n行的每一列的值分別賦予對應(yīng)數(shù)組的第n個(gè)元素。 createXML()方法完成XML文檔的構(gòu)建。此方法其實(shí)是第七章DOM創(chuàng)建XML文檔的擴(kuò)展,數(shù)據(jù)的來源不再是程序中簡單地給出,而是來自一個(gè)數(shù)據(jù)庫。9.2 XML文檔到數(shù)據(jù)庫表的轉(zhuǎn)換本節(jié)我們討論XML文檔到數(shù)據(jù)庫表的轉(zhuǎn)換。編程語言仍是Java、解析XML使用DOM接口、數(shù)據(jù)庫使用Access。9

17、.2.1 準(zhǔn)備XML文檔和數(shù)據(jù)庫表XML文檔準(zhǔn)備用上節(jié)生成的newXML.xml。數(shù)據(jù)庫也使用上節(jié)的庫。需要新建一個(gè)表“普通員工信息表”,各字段的定義復(fù)制“員工信息表”,數(shù)據(jù)內(nèi)容為空。9.2.2 Java處理程序的編制Java處理程序代碼如下。import org.w3c.dom.*; import javax.xml.parsers.*;import java.io.*;import java.sql.*;public class XML_DataBase Connection con; Statement sql; ResultSet rs; int number; String name

18、="" String gender="" int age; String title="" float salary; boolean flag; int recordAmount; private void connection() try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection("jdbc:odbc:donghong"); catch(ClassNotFoundExcepti

19、on e) System.out.println(""+e); catch(SQLException e1) System.out.println(""+e1); private void WriteRecord() for(int k=0;k<recordAmount;k+) if(!flagk)continue; try sql=con.createStatement(); String insertData="INSERT INTO 普通員工信息表 VALUES("+numberk+",'"+n

20、amek+"','"+genderk+"',"+agek+",'"+titlek+"',"+salaryk+")" sql.executeUpdate(insertData); catch(SQLException e) System.out.println(e); try con.close(); catch(SQLException e) System.out.println(e); private void ReadXML() try Documen

21、tBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse(new File("newXML.xml"); Element root=document.getDocumentElement(); String rootName=root.getNodeName(); NodeList nodelist=root.getElementsByT

22、agName("員工"); recordAmount=nodelist.getLength(); number=new intrecordAmount; name=new StringrecordAmount; gender=new StringrecordAmount; age=new intrecordAmount; title=new StringrecordAmount; salary=new floatrecordAmount; flag=new booleanrecordAmount; for(int i=0;i<recordAmount;i+) flag

23、i=false; for(int k=0;k<name.length;k+) Node node=nodelist.item(k); if(node.getNodeType()=Node.ELEMENT_NODE) Element element=(Element)node; NodeList list=element.getChildNodes(); int shu=list.getLength(); for(int m=shu-1;m>=0;m-) Node jiedian=list.item(m); Element ele=(Element)jiedian; if(m=shu

24、-1&&Float.parseFloat(ele.getTextContent()>5000) break; flagk=true; switch(m) case 0:numberk=Integer.parseInt(ele.getTextContent();break; case 1:namek=ele.getTextContent();break; case 2:genderk=ele.getTextContent();break; case 3:agek=Integer.parseInt(ele.getTextContent();break; case 4:titl

25、ek=ele.getTextContent();break; case 5:salaryk=Float.parseFloat(ele.getTextContent();break; catch(Exception e) System.out.println(e); public static void main(String arg) XML_DataBase data=new XML_DataBase(); data.connection(); data.ReadXML(); data.WriteRecord(); 在Java開發(fā)環(huán)境中保存文件為XML_DataBase.java,編譯并運(yùn)行

26、,得到的新Access表如圖9.8所示。圖9.8 由XML文檔生成的Access表程序關(guān)鍵內(nèi)容解讀如下:ReadXML()方法負(fù)責(zé)讀取XML文檔中的數(shù)據(jù)。此處對需要的數(shù)據(jù)進(jìn)行了一個(gè)簡單的篩選,月薪少于5000的人員信息被讀取出來。為此用到了標(biāo)志flag表示是否符合要求,用到了break語句跳出循環(huán)。讀取到的XML文檔中的第n個(gè)員工的信息分別放入6個(gè)數(shù)組的第n個(gè)元素中。connection()方法負(fù)責(zé)連接數(shù)據(jù)庫,同上例。WriteRecord()方法負(fù)責(zé)把符合要求的數(shù)據(jù)寫入規(guī)定的表中。使用的是常用的SQL的INSERT INTO語句,無須贅述。9.3 XML文檔到Excel表的轉(zhuǎn)換 前已述及,X

27、ML要想融入各種系統(tǒng)中,與多種格式文檔進(jìn)行轉(zhuǎn)換非常必要。Excel表以簡單實(shí)用、功能強(qiáng)大,受到越來越多人士的歡迎,尤其是從事實(shí)際工程人員的喜愛。本節(jié)要講解XML與Excel表之間的轉(zhuǎn)換。由于要對Excel表進(jìn)行操作,為此對操作工具進(jìn)行簡單介紹。9.3.1 Apache POI及其類庫的配置Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。其結(jié)構(gòu)如下:HSSF 提供讀寫Microsoft Excel格式檔案的功能。 XSSF 提供讀寫Microsoft Excel OOXML格式檔案的功能。 HWP

28、F 提供讀寫Microsoft Word格式檔案的功能。 HSLF 提供讀寫Microsoft PowerPoint格式檔案的功能。 HDGF 提供讀寫Microsoft Visio格式檔案的功能。在此處,我們只用到了它的HSSF類。首先,從/download.html上下載最新的POI類庫,將其解壓的包中的“poi-bin-3.7-20101029”這個(gè)jar包放入自己認(rèn)為方便的位置。在開發(fā)環(huán)境中將這個(gè)jar包加入進(jìn)來才可以使用,我使用的開發(fā)環(huán)境是Eclipse。在Eclipse IDE的左邊欄的Package Eexplorer欄內(nèi)的Referenc

29、ed Libraries項(xiàng)上右鍵點(diǎn)擊彈出菜單,點(diǎn)擊Build PathàConfigurate Build Path彈出界面如圖9.9所示。圖9.9 外部包的加入在Libraries標(biāo)簽中單擊“Add External JARs”,將存放POI的路徑指定即可。9.3.2 XML文檔到Excel表轉(zhuǎn)換設(shè)計(jì) 以實(shí)例說明設(shè)計(jì)過程。所需XML文檔使用9.1中生成的newXML.xml文件,Java處理程序代碼如下。import java.io.File;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuild

30、er;import javax.xml.parsers.DocumentBuilderFactory;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.w3c.dom.Document;import org.w3c.dom.Element;import

31、 org.w3c.dom.Node;import org.w3c.dom.NodeList;public class XML_Excel int number; String name="" String gender="" int age; String title="" float salary; boolean flag; int recordAmount; public static String outputFile="D:/JTest/gongye.xls" String head="員工號&

32、quot;,"姓名","性別","年齡","職務(wù)","月薪"private void ReadXML() try DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse(new File("D:JTestnewXML.xml"

33、;); Element root=document.getDocumentElement(); String rootName=root.getNodeName(); NodeList nodelist=root.getElementsByTagName("員工"); recordAmount=nodelist.getLength(); number=new intrecordAmount; name=new StringrecordAmount; gender=new StringrecordAmount; age=new intrecordAmount; title=n

34、ew StringrecordAmount; salary=new floatrecordAmount; flag=new booleanrecordAmount; for(int i=0;i<recordAmount;i+) flagi=false; for(int k=0;k<name.length;k+) Node node=nodelist.item(k); if(node.getNodeType()=Node.ELEMENT_NODE) Element element=(Element)node; NodeList list=element.getChildNodes()

35、; int shu=list.getLength(); for(int m=shu-1;m>=0;m-) Node jiedian=list.item(m); Element ele=(Element)jiedian; if(m=shu-1&&Float.parseFloat(ele.getTextContent()>8000) break; flagk=true; switch(m) case 0:numberk=Integer.parseInt(ele.getTextContent();break; case 1:namek=ele.getTextContent

36、();break; case 2:genderk=ele.getTextContent();break; case 3:agek=Integer.parseInt(ele.getTextContent();break; case 4:titlek=ele.getTextContent();break; case 5:salaryk=Float.parseFloat(ele.getTextContent();break; catch(Exception e) System.out.println(e); private void createExcel()tryHSSFWorkbook work

37、book = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("普通員工信息表");HSSFRow row = sheet.createRow(short)0);for(int i=0;i<head.length;i+)HSSFCell cell = row.createCell(i);cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setCellValue(headi);int zz=1;for(int k=0;k<recordAmount;k

38、+) if(!flagk)continue; row = sheet.createRow(short)zz+); for(int yy=0;yy<6;yy+) switch(yy) case 0:row.createCell(yy).setCellValue(numberk);break; case 1:row.createCell(yy).setCellValue(namek);break; case 2:row.createCell(yy).setCellValue(genderk);break; case 3:row.createCell(yy).setCellValue(agek

39、);break; case 4:row.createCell(yy).setCellValue(titlek);break; case 5:row.createCell(yy).setCellValue(salaryk);break; FileOutputStream fOut = new FileOutputStream(outputFile);workbook.write(fOut);fOut.flush();fOut.close();System.out.println("文件生成.");catch(Exception e) System.out.println(&q

40、uot; " + e );/* * param args */public static void main(String args) / TODO Auto-generated method stubXML_Excel obj=new XML_Excel();obj.ReadXML();obj.createExcel();新生成的Excel表如圖9.10所示。圖9.10 新生成的Excel表效果程序總體上分兩部分XML數(shù)據(jù)的讀取和生成新的Excel表。ReadXML()方法完成數(shù)據(jù)的讀取。采用的方法和上節(jié)是一致的,只是在細(xì)節(jié)上讀取數(shù)據(jù)從薪水小于等于5000改成8000,余者無太大變

41、化。 createExcel()方法生成新的Excel表。和前面實(shí)例不一樣的包都是為此功能引入的。利用“HSSFWorkbook workbook = new HSSFWorkbook();”生成工作薄,并依次構(gòu)建表單HSSFSheet、行HSSFRow和單元格HSSFCell;在第一行填入標(biāo)題,標(biāo)題的內(nèi)容在head字符串?dāng)?shù)組中;接下來一個(gè)循環(huán)中生成新行、單元格并將6個(gè)數(shù)組的內(nèi)容填入合適的位置;最后,存入外存。9.4 Excel表到XML文檔的轉(zhuǎn)換 本轉(zhuǎn)換和上節(jié)時(shí)正好相逆的過程。實(shí)例所用Excel表為上節(jié)生成的,Java處理程序代碼如下。package swtjfaceExample;impo

42、rt java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.Iterator;import java.util.List;import java.util.Vector;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transf

43、ormer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermo

44、del.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;public class Excel_XML Vector item,kkk; String element="員工號","姓名","性別","年齡","職務(wù)","月薪"/* * param args */public void Read_Excel()item=new Vector();kkk=new Vector();tryFileInputStream ggg=new FileInputStream("D:JTestgongye.xls");Workbook wb = new HSSFWorkbook(ggg);Sheet sheet = wb.getSheetAt(0);for (Iterator<Row> rit = sheet.rowIterator(); rit

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論