版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
工程培訓(xùn)XML和數(shù)據(jù)庫工程培訓(xùn)XML和數(shù)據(jù)庫GR-XML培訓(xùn)1回憶-1XMLDSO是一個(gè)MicrosoftActiveX控件,嵌入到MicrosoftInternetExplorer中DSO有助于格式化數(shù)據(jù)并將這些數(shù)據(jù)顯示在HTML頁面上DSO可用于從外部XML文檔或從嵌入到HTML文檔的XML數(shù)據(jù)中提取數(shù)據(jù)<xml>和</xml>標(biāo)簽之間綁定的XML數(shù)據(jù)稱為XML數(shù)據(jù)島回憶-1XMLDSO是一個(gè)MicrosoftA2回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽或通過使用JavaScript創(chuàng)立函數(shù),將外部XML文檔鏈接到HTML文檔可以使用datasrc和datafld屬性從數(shù)據(jù)島中提取數(shù)據(jù)DSO可用于使用樣式表中定義的樣式來顯示XML數(shù)據(jù)島的數(shù)據(jù)回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽3本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域XML導(dǎo)入數(shù)據(jù)庫XML導(dǎo)出數(shù)據(jù)庫本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域4實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?xmlversion="1.0"encoding="UTF-8"?><company> <employee> <personid="DE001"> <name>張三</name> <age>40</age> <pay>1800</pay> </person> <personid="DE002"> <name>小王</name> <age>20</age> <pay>1500</pay> </person> <personid="DE003"> <name>小周</name> <age>30</age> <pay>2000</pay> </person> </employee>將如下文檔中的員工信息解析出來存入company數(shù)據(jù)庫中的employee表中,將顧客信息解析出來存入company數(shù)據(jù)庫中的buyer表中:員工信息
實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?x5 <buyer> <personid="BY001"> <name>Marry</name> <age>33</age> <phone>lt;/phone> <email>marrymm@163.com</email> </person> <personid="BY002"> <name>Sandenly</name> <age>20</age> <phone>lt;/phone> <email>sandenlygg@163.com</email> </person> </buyer></company>顧客信息 <buyer>顧客信息6XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于將大量運(yùn)算分布在客戶端進(jìn)行,以減少服務(wù)器的負(fù)載應(yīng)用于數(shù)據(jù)轉(zhuǎn)換應(yīng)用于將同一數(shù)據(jù)以不同的面貌展現(xiàn)給不同的用戶XML應(yīng)用于網(wǎng)絡(luò)代理XML成為一種各種程序都能自動(dòng)理解和處理數(shù)據(jù)的規(guī)范??蛻艨梢愿鶕?jù)自己的需求選擇和制作不同的應(yīng)用程序來處理數(shù)據(jù),而服務(wù)器只須發(fā)出同一個(gè)XML文件
使用XML可以使得數(shù)據(jù)源與顯示分離。這一應(yīng)用將會(huì)使得網(wǎng)絡(luò)用戶界面趨向個(gè)性化、風(fēng)格化。同一個(gè)XML可以被多個(gè)用戶進(jìn)行編輯、增減以適應(yīng)該用戶的需要,類似于設(shè)置權(quán)限。XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于7XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)
以SQLServer數(shù)據(jù)庫為例,在一個(gè)名為“mydb”的數(shù)據(jù)庫中,有一張關(guān)于person信息的表“mytable”,字段信息和數(shù)據(jù)信息如下:字段信息表數(shù)據(jù)信息表XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)以SQLServ8importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML1{ staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument();importjava.sql.*;9 //創(chuàng)建根節(jié)點(diǎn) Elementpeople=doc.createElement("people"); while(result.next()){ Elementperson=doc.createElement("person"); people.appendChild(person); Elementname=doc.createElement("name"); /*獲取數(shù)據(jù)庫中name字段的值, 并作為xml文檔中name元素的字符數(shù)據(jù)*/ name.appendChild(doc.createTextNode( result.getString("name"))); person.appendChild(name); Elementage=doc.createElement("age"); age.appendChild(doc.createTextNode( result.getInt("age")+"")); person.appendChild(age); Elementaddr=doc.createElement("address"); addr.appendChild(doc.createTextNode( result.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild(doc.createTextNode( result.getString("phone"))); person.appendChild(phone); } //創(chuàng)建根節(jié)點(diǎn)10 doc.appendChild(people); //將dom樹導(dǎo)出到文件中 ((XmlDocument)doc).write( newFileOutputStream(newFile("person.xml"))); }catch(Exceptione){e.printStackTrace();} }}程序運(yùn)行完成后,使用記事本打開“person.xml”文件 doc.appendChild(people);程序運(yùn)11XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“mytable1”和“mytable2”,他們之間通過外鍵“personid”而相約束,如下:表mytable1數(shù)據(jù)信息表mytable2字段信息表mytable1字段信息表mytable2字段信息XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“myt12importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML2{
staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //連接數(shù)據(jù)庫 Stringclassforname="com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable1"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument(); Elementpeople=doc.createElement("people");importjava.sql.*;13 while(result.next()){ Elementperson=doc.createElement("person"); Stringstr=result.getString("personid"); person.setAttribute("id",str); people.appendChild(person); Elementusername=doc.createElement("username"); username.appendChild( doc.createTextNode(result.getString("username"))); person.appendChild(username); Elementpass=doc.createElement("password"); pass.appendChild( doc.createTextNode(result.getString("password"))); person.appendChild(pass); //查詢表mytable2并向XML文檔中添加元素和字符數(shù)據(jù) ResultSetrs=con.createStatement().executeQuery( "SELECT*FROMmytable2" +"wherepersonid='"+str+"'"); while(rs.next()){ Elementuname=doc.createElement("uname"); uname.appendChild( doc.createTextNode(rs.getString("uname"))); person.appendChild(uname); Elementage=doc.createElement("age"); age.appendChild( doc.createTextNode(rs.getInt("age")+"")); person.appendChild(age); while(result.next()){14 Elementaddr=doc.createElement("address"); addr.appendChild( doc.createTextNode(rs.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild( doc.createTextNode(rs.getString("phone"))); person.appendChild(phone); } } doc.appendChild(people); ((XmlDocument)doc).write(newFileOutputStream(newFile("person2.xml"))); }catch(Exceptione){e.printStackTrace();} } }程序運(yùn)行完成后用記事本打開person2.xml Elementaddr=doc.createEl15XML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫
<?xmlversion="1.0"encoding="UTF-8"?> <people> <personid="a001"> <username>aa</username> <password>12345</password> <uname>張三</uname> <age>20</age> <address>北京</address> <phone>12461238</phone> </person> <personid="a002"> <username>bb</username> <password>987562</password> <uname>李四</uname> <age>22</age> <address>北京</address> <phone>98421354</phone> </person> </people>需要導(dǎo)入數(shù)據(jù)庫的XML文檔person.xmlXML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫<?xmlv16文檔中有多個(gè)“person”元素,每個(gè)“person”元素包括一個(gè)屬性和六個(gè)子元素,而這六個(gè)子元素除了有字符數(shù)據(jù)外,并不包含其他的任何子元素。經(jīng)過分析,可以考慮將“person”元素對(duì)應(yīng)到數(shù)據(jù)庫中的一個(gè)表,而把它所包括的屬性和子元素作為該表的字段,如下:“person”表的字段信息
文檔中有多個(gè)“person”元素,每個(gè)“person”元素包17importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassXMLtoDB1{ publicstaticvoidmain(Stringargs[]){ Stringid,username,password,uname,address,phone,sql,agestr; intage; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl= "jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); //獲取Document實(shí)例 DocumentBuilderFactoryfactory= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdoc=builder.parse( newFileInputStream(newFile("person.xml"))); importjava.sql.*;18 NodeListnodes=doc.getElementsByTagName("person"); for(inti=0;i<nodes.getLength();i++){ Elementnode=(Element)nodes.item(i); id=node.getAttributes().getNamedItem("id").getNodeValue(); username=node.getElementsByTagName("username"). item(0).getFirstChild().getNodeValue(); password=node.getElementsByTagName("password"). item(0).getFirstChild().getNodeValue(); uname=node.getElementsByTagName("uname"). item(0).getFirstChild().getNodeValue(); agestr=node.getElementsByTagName("age"). item(0).getFirstChild().getNodeValue(); age=Integer.parseInt(agestr); address=node.getElementsByTagName("address"). item(0).getFirstChild().getNodeValue(); phone=node.getElementsByTagName("phone"). item(0).getFirstChild().getNodeValue(); //向數(shù)據(jù)庫中添加數(shù)據(jù) sql="insertintopersonvalues('"+id+"','"+username +"','"+password+"',"+"'"+uname+"','"+age +"','"+address+"','"+phone+"')"; con.createStatement().executeUpdate(sql); } }catch(Exceptione){e.printStackTrace();} }} NodeListnodes=doc.getEleme19將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射
基于表的映射
基于表的映射
所謂基于表的映射是指可以把文檔看成一個(gè)單一的表或單一的組表。將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射基于表20基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型的結(jié)構(gòu):第一種:<table> <row> <column1></column1> <columnn></columnn> </row> <row> <column1></column1> <columnn></columnn> </row></table><tables> <table1> <row> <column1></column1> <columnn></columnn> </row> </table1> <tablen> <row> <column1></column1> <columnm></columnm> </row> </tablen></tables>第二種:可以將文檔看成是一個(gè)單一的表可以將文檔看成是一個(gè)由一組表組成的庫基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型21基于表的映射的優(yōu)缺點(diǎn)這種映射的優(yōu)點(diǎn)是它的簡單性。因?yàn)樗ヅ湓陉P(guān)系數(shù)據(jù)庫中的表和結(jié)果集的結(jié)構(gòu)非常簡單,基于這種映射的XML和數(shù)據(jù)庫轉(zhuǎn)換的代碼很容易編寫,并對(duì)特定應(yīng)用非常有用,比如在數(shù)據(jù)庫之間一次只牽扯到一個(gè)表的數(shù)據(jù)傳輸。這種映射有許多缺點(diǎn),最顯著的是它只能處理XML文檔的非常小的節(jié)點(diǎn)集?;诒淼挠成涞膬?yōu)缺點(diǎn)這種映射的優(yōu)點(diǎn)是它的簡單性。因?yàn)樗ヅ湓?2基于對(duì)象的映射所謂基于對(duì)象的映射可以簡單的理解為“對(duì)象與關(guān)系”,這種映射通常與關(guān)系數(shù)據(jù)庫一起使用。該映射主要用于XML模式(主要指DTD)到數(shù)據(jù)庫模式的映射。即將DTD先映射為對(duì)象模式,再由對(duì)象模式到數(shù)據(jù)庫模式。主要分為:映射屬性映射元素
基于對(duì)象的映射所謂基于對(duì)象的映射可以簡單的理解為“對(duì)象與關(guān)23映射元素映射元素首先將簡單的元素類型映射為基本的數(shù)據(jù)類型,然后再將復(fù)雜的元素類型映射為類(class),該復(fù)雜元素類型中的簡單元素類型相應(yīng)的映射為該類的屬性(變量)。如下:<!ELEMENTCheck(CD)><!ELEMENTCD(title,artist,country)><!ELEMENTtitle(#PCDATA)><!ELEMENTartist(#PCDATA)><!ELEMENTcountry(#PCDATA)>classCheck{ CDcd;//一個(gè)CD類對(duì)象}classCD{ Stringtitle; Stringartist; Stringcountry;}將Check類映射為庫,將CD類映射為該庫中的表,或者將Check類和CD類都映射為表,而用主鍵、外鍵將這兩個(gè)表關(guān)聯(lián)。將變量“title”、“artist”和“country”映射為該表中的字段。映射為對(duì)象模式映射為數(shù)據(jù)庫模式映射元素映射元素首先將簡單的元素類型映射為基本的數(shù)據(jù)類型,24對(duì)操作符的映射如果一個(gè)DTD語句中提供了“+”或“*”操作符,則需要把該元素類型作為復(fù)雜類型,并將其映射成一個(gè)數(shù)組變量,它是一個(gè)未知大小的數(shù)組。這個(gè)數(shù)組也必須被映射成一個(gè)表,它將為每個(gè)值包含一行。通過主鍵、外鍵聯(lián)系將該表與其他的表建立關(guān)系。如下:<!ELEMENTA(B+,C,D)><!ELEMENTB(#PCDATA)><!ELEMENTC(#PCDATA)><!ELEMENTD(#PCDATA)>classA{ String[]b; Stringc; Stringd;}TableA: Columna_pk Columnc ColumndTableB: Columna_fk Columnb映射為對(duì)象模式映射為數(shù)據(jù)庫模式對(duì)操作符的映射如果一個(gè)DTD語句中提供了“+”或“*”操作25映射屬性CDATA、ID、IDREF、NMTOKEN、ENTITY、NOTATION和枚舉這七種屬于單值,通常將其映射為類中的變量,然后再映射到數(shù)據(jù)庫中表的字段。IDREFS、NMTOKENS和ENTITIES這三種類型的屬性可以是多值。通常將其映射為類中的數(shù)組變量,然后再映射到數(shù)據(jù)庫中的表。注意:有些文檔使用ENTITY和ENTITIES屬性把未分析的、外部數(shù)據(jù)(比如一個(gè)二進(jìn)制文件)與XML文檔關(guān)聯(lián)起來。在對(duì)它們映射時(shí)同任何其他屬性一樣,不同的是,在傳輸數(shù)據(jù)的時(shí)候,必須用實(shí)體替換屬性值(在從XML傳輸數(shù)據(jù)到數(shù)據(jù)庫的時(shí)候)。映射屬性CDATA、ID、IDREF、NMTOKEN、EN26ID和IDREF或IDREFS屬性的映射<A> <Bid="1"></B> <Cref_id="1"></C> <Dref_id="1"></D></A>在數(shù)據(jù)庫中一般使用主鍵和外鍵將其關(guān)聯(lián),如下:TableA: Columna_pkTableB: Columna_fk Columnref_idTableC: Columna_fk Columnref_idTableD: Columna_fk ColumnidXML文檔數(shù)據(jù)庫中表和字段信息
ID和IDREF或IDREFS屬性的映射<A>在數(shù)據(jù)庫中27實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫>程序的實(shí)現(xiàn)要求如下:〔1〕創(chuàng)立兩個(gè)表?!?〕使用DOM分別解析employee元素和buyer元素。實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫>程序的28工程培訓(xùn)XML和數(shù)據(jù)庫工程培訓(xùn)XML和數(shù)據(jù)庫GR-XML培訓(xùn)29回憶-1XMLDSO是一個(gè)MicrosoftActiveX控件,嵌入到MicrosoftInternetExplorer中DSO有助于格式化數(shù)據(jù)并將這些數(shù)據(jù)顯示在HTML頁面上DSO可用于從外部XML文檔或從嵌入到HTML文檔的XML數(shù)據(jù)中提取數(shù)據(jù)<xml>和</xml>標(biāo)簽之間綁定的XML數(shù)據(jù)稱為XML數(shù)據(jù)島回憶-1XMLDSO是一個(gè)MicrosoftA30回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽或通過使用JavaScript創(chuàng)立函數(shù),將外部XML文檔鏈接到HTML文檔可以使用datasrc和datafld屬性從數(shù)據(jù)島中提取數(shù)據(jù)DSO可用于使用樣式表中定義的樣式來顯示XML數(shù)據(jù)島的數(shù)據(jù)回憶-2可以通過在HTML文檔中使用<xml>標(biāo)簽31本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域XML導(dǎo)入數(shù)據(jù)庫XML導(dǎo)出數(shù)據(jù)庫本章知識(shí)點(diǎn)XML的數(shù)據(jù)庫應(yīng)用領(lǐng)域32實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?xmlversion="1.0"encoding="UTF-8"?><company> <employee> <personid="DE001"> <name>張三</name> <age>40</age> <pay>1800</pay> </person> <personid="DE002"> <name>小王</name> <age>20</age> <pay>1500</pay> </person> <personid="DE003"> <name>小周</name> <age>30</age> <pay>2000</pay> </person> </employee>將如下文檔中的員工信息解析出來存入company數(shù)據(jù)庫中的employee表中,將顧客信息解析出來存入company數(shù)據(jù)庫中的buyer表中:員工信息
實(shí)驗(yàn)——<將關(guān)于員工和客戶信息的XML導(dǎo)入數(shù)據(jù)庫><?x33 <buyer> <personid="BY001"> <name>Marry</name> <age>33</age> <phone>lt;/phone> <email>marrymm@163.com</email> </person> <personid="BY002"> <name>Sandenly</name> <age>20</age> <phone>lt;/phone> <email>sandenlygg@163.com</email> </person> </buyer></company>顧客信息 <buyer>顧客信息34XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于將大量運(yùn)算分布在客戶端進(jìn)行,以減少服務(wù)器的負(fù)載應(yīng)用于數(shù)據(jù)轉(zhuǎn)換應(yīng)用于將同一數(shù)據(jù)以不同的面貌展現(xiàn)給不同的用戶XML應(yīng)用于網(wǎng)絡(luò)代理XML成為一種各種程序都能自動(dòng)理解和處理數(shù)據(jù)的規(guī)范。客戶可以根據(jù)自己的需求選擇和制作不同的應(yīng)用程序來處理數(shù)據(jù),而服務(wù)器只須發(fā)出同一個(gè)XML文件
使用XML可以使得數(shù)據(jù)源與顯示分離。這一應(yīng)用將會(huì)使得網(wǎng)絡(luò)用戶界面趨向個(gè)性化、風(fēng)格化。同一個(gè)XML可以被多個(gè)用戶進(jìn)行編輯、增減以適應(yīng)該用戶的需要,類似于設(shè)置權(quán)限。XML的應(yīng)用領(lǐng)域XML的應(yīng)用可以分為以下幾個(gè)方面:應(yīng)用于35XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)
以SQLServer數(shù)據(jù)庫為例,在一個(gè)名為“mydb”的數(shù)據(jù)庫中,有一張關(guān)于person信息的表“mytable”,字段信息和數(shù)據(jù)信息如下:字段信息表數(shù)據(jù)信息表XML導(dǎo)出數(shù)據(jù)庫XML導(dǎo)出單個(gè)表的數(shù)據(jù)以SQLServ36importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML1{ staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument();importjava.sql.*;37 //創(chuàng)建根節(jié)點(diǎn) Elementpeople=doc.createElement("people"); while(result.next()){ Elementperson=doc.createElement("person"); people.appendChild(person); Elementname=doc.createElement("name"); /*獲取數(shù)據(jù)庫中name字段的值, 并作為xml文檔中name元素的字符數(shù)據(jù)*/ name.appendChild(doc.createTextNode( result.getString("name"))); person.appendChild(name); Elementage=doc.createElement("age"); age.appendChild(doc.createTextNode( result.getInt("age")+"")); person.appendChild(age); Elementaddr=doc.createElement("address"); addr.appendChild(doc.createTextNode( result.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild(doc.createTextNode( result.getString("phone"))); person.appendChild(phone); } //創(chuàng)建根節(jié)點(diǎn)38 doc.appendChild(people); //將dom樹導(dǎo)出到文件中 ((XmlDocument)doc).write( newFileOutputStream(newFile("person.xml"))); }catch(Exceptione){e.printStackTrace();} }}程序運(yùn)行完成后,使用記事本打開“person.xml”文件 doc.appendChild(people);程序運(yùn)39XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“mytable1”和“mytable2”,他們之間通過外鍵“personid”而相約束,如下:表mytable1數(shù)據(jù)信息表mytable2字段信息表mytable1字段信息表mytable2字段信息XML導(dǎo)出多個(gè)表關(guān)聯(lián)的數(shù)據(jù)如“mydb”庫中有表“myt40importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassDBtoXML2{
staticConnectioncon; publicstaticvoidmain(Stringargs[]){ Documentdoc; try{ //連接數(shù)據(jù)庫 Stringclassforname="com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl="jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); Statementsta=con.createStatement(); ResultSetresult=sta.executeQuery( "SELECT*FROMmytable1"); //獲取Document實(shí)例 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dbf.newDocumentBuilder(); doc=builder.newDocument(); Elementpeople=doc.createElement("people");importjava.sql.*;41 while(result.next()){ Elementperson=doc.createElement("person"); Stringstr=result.getString("personid"); person.setAttribute("id",str); people.appendChild(person); Elementusername=doc.createElement("username"); username.appendChild( doc.createTextNode(result.getString("username"))); person.appendChild(username); Elementpass=doc.createElement("password"); pass.appendChild( doc.createTextNode(result.getString("password"))); person.appendChild(pass); //查詢表mytable2并向XML文檔中添加元素和字符數(shù)據(jù) ResultSetrs=con.createStatement().executeQuery( "SELECT*FROMmytable2" +"wherepersonid='"+str+"'"); while(rs.next()){ Elementuname=doc.createElement("uname"); uname.appendChild( doc.createTextNode(rs.getString("uname"))); person.appendChild(uname); Elementage=doc.createElement("age"); age.appendChild( doc.createTextNode(rs.getInt("age")+"")); person.appendChild(age); while(result.next()){42 Elementaddr=doc.createElement("address"); addr.appendChild( doc.createTextNode(rs.getString("address"))); person.appendChild(addr); Elementphone=doc.createElement("phone"); phone.appendChild( doc.createTextNode(rs.getString("phone"))); person.appendChild(phone); } } doc.appendChild(people); ((XmlDocument)doc).write(newFileOutputStream(newFile("person2.xml"))); }catch(Exceptione){e.printStackTrace();} } }程序運(yùn)行完成后用記事本打開person2.xml Elementaddr=doc.createEl43XML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫
<?xmlversion="1.0"encoding="UTF-8"?> <people> <personid="a001"> <username>aa</username> <password>12345</password> <uname>張三</uname> <age>20</age> <address>北京</address> <phone>12461238</phone> </person> <personid="a002"> <username>bb</username> <password>987562</password> <uname>李四</uname> <age>22</age> <address>北京</address> <phone>98421354</phone> </person> </people>需要導(dǎo)入數(shù)據(jù)庫的XML文檔person.xmlXML導(dǎo)入數(shù)據(jù)庫將簡單的XML文檔導(dǎo)入數(shù)據(jù)庫<?xmlv44文檔中有多個(gè)“person”元素,每個(gè)“person”元素包括一個(gè)屬性和六個(gè)子元素,而這六個(gè)子元素除了有字符數(shù)據(jù)外,并不包含其他的任何子元素。經(jīng)過分析,可以考慮將“person”元素對(duì)應(yīng)到數(shù)據(jù)庫中的一個(gè)表,而把它所包括的屬性和子元素作為該表的字段,如下:“person”表的字段信息
文檔中有多個(gè)“person”元素,每個(gè)“person”元素包45importjava.sql.*;importjavax.xml.parsers.*;importorg.apache.crimson.tree.*;importorg.w3c.dom.*;importjava.io.*;publicclassXMLtoDB1{ publicstaticvoidmain(Stringargs[]){ Stringid,username,password,uname,address,phone,sql,agestr; intage; try{ //建立數(shù)據(jù)庫連接 Stringclassforname= "com.microsoft.jdbc.sqlserver.SQLServerDriver"; Stringurl= "jdbc:microsoft:sqlserver://localhost:1433;" +"databasename=mydb"; Class.forName(classforname); Connectioncon=DriverManager.getConnection(url,"sa",""); //獲取Document實(shí)例 DocumentBuilderFactoryfactory= DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdoc=builder.parse( newFileInputStream(newFile("person.xml"))); importjava.sql.*;46 NodeListnodes=doc.getElementsByTagName("person"); for(inti=0;i<nodes.getLength();i++){ Elementnode=(Element)nodes.item(i); id=node.getAttributes().getNamedItem("id").getNodeValue(); username=node.getElementsByTagName("username"). item(0).getFirstChild().getNodeValue(); password=node.getElementsByTagName("password"). item(0).getFirstChild().getNodeValue(); uname=node.getElementsByTagName("uname"). item(0).getFirstChild().getNodeValue(); agestr=node.getElementsByTagName("age"). item(0).getFirstChild().getNodeValue(); age=Integer.parseInt(agestr); address=node.getElementsByTagName("address"). item(0).getFirstChild().getNodeValue(); phone=node.getElementsByTagName("phone"). item(0).getFirstChild().getNodeValue(); //向數(shù)據(jù)庫中添加數(shù)據(jù) sql="insertintopersonvalues('"+id+"','"+username +"','"+password+"',"+"'"+uname+"','"+age +"','"+address+"','"+phone+"')"; con.createStatement().executeUpdate(sql); } }catch(Exceptione){e.printStackTrace();} }} NodeListnodes=doc.getEleme47將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射
基于表的映射
基于表的映射
所謂基于表的映射是指可以把文檔看成一個(gè)單一的表或單一的組表。將XML映射到數(shù)據(jù)庫`主要形式有:基于對(duì)象的映射基于表48基于表的映射基于表映射的文檔的結(jié)構(gòu)必須是如下所示的兩種類型的結(jié)構(gòu):第一種:<table> <row> <column1></column1> <columnn></columnn> </row> <row> <column1></
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國冰箱行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國美容培訓(xùn)行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實(shí)施研究報(bào)告
- 建設(shè)施工過程職業(yè)病危害防治總結(jié)報(bào)告
- 肇慶市中小學(xué)教學(xué)質(zhì)量評(píng)估2012屆高中畢業(yè)班第二次模擬試題數(shù)學(xué)(理)
- 浙江中乾計(jì)量校準(zhǔn)有限公司介紹企業(yè)發(fā)展分析報(bào)告
- 軟件評(píng)估報(bào)告范例怎么寫
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)集錦
- 年產(chǎn)毛竹纖維粉生物基可降解材料項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 年產(chǎn)15萬噸(折百)稀硝酸及10萬噸濃硝酸項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 二零二五年度技術(shù)服務(wù)合同標(biāo)的和技術(shù)要求
- DL∕T 2138-2020 電力專利價(jià)值評(píng)估規(guī)范
- NB-T10859-2021水電工程金屬結(jié)構(gòu)設(shè)備狀態(tài)在線監(jiān)測系統(tǒng)技術(shù)條件
- GJB9001C產(chǎn)品風(fēng)險(xiǎn)評(píng)估報(bào)告
- 2024年天津三源電力集團(tuán)限公司社會(huì)招聘33人【重點(diǎn)基礎(chǔ)提升】模擬試題(共500題)附帶答案詳解
- 水利工程施工單位竣工資料目錄
- 技術(shù)經(jīng)濟(jì)學(xué)(中國石油大學(xué)(華東))-知到答案、智慧樹答案
- 《中國高鐵作業(yè)設(shè)計(jì)方案-2023-2024學(xué)年科學(xué)冀人版》
- 招標(biāo)代理服務(wù)服務(wù)方案
- 工地生活垃圾處理方案
- 初一數(shù)學(xué)上冊(cè)有理數(shù)加減混合運(yùn)算練習(xí)題及答案(共100題)
- 論蘇軾詩詞中的曠達(dá)風(fēng)格
評(píng)論
0/150
提交評(píng)論