擴(kuò)展標(biāo)記語言XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立。XML的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語言,可以說,“沒有XML,就沒有編程的未來”。
XML主要應(yīng)用在以下幾個(gè)方面:
1. 設(shè)計(jì)標(biāo)記語言,如CML,MathML, WML等。
2. 數(shù)據(jù)交換和數(shù)據(jù)整合,這是XML最激動(dòng)人心的應(yīng)用。
3. 媒體無關(guān)的數(shù)據(jù)發(fā)布
4. 智能代理和本地計(jì)算
5. 精確搜索
6. 文件保值
XML的語法非常的簡(jiǎn)單,XML文檔由節(jié)點(diǎn)組成,使用打開和關(guān)閉節(jié)點(diǎn)描述標(biāo)記,在格式上與HTML標(biāo)記非常相似,它們之間最大的不同是:XML中可以自由定義標(biāo)記名。比如下面的標(biāo)記就描述了一個(gè)主頁(yè)地址:
<web>http://hongwanfu.126.com</web>
注意,XML不用聲明標(biāo)記名就可以使用,而且,開始和結(jié)束標(biāo)記必須相同,XML是識(shí)別大小寫的,所以標(biāo)記的大小寫也必須相同。
節(jié)點(diǎn)標(biāo)記中可以包含屬性,比如:
<web type=”Homepage”>http://hongwanfu.126.com</web> |
代碼中Web節(jié)點(diǎn)包含屬性Type,其值為Homepage.
如果不愿意在節(jié)點(diǎn)中包含一個(gè)值,那么可以不需要結(jié)束標(biāo)記,可以用在開始標(biāo)記的后面加一個(gè)斜線來結(jié)束節(jié)點(diǎn),在下面的例子中,Web標(biāo)記的屬性就存儲(chǔ)了一個(gè)電話號(hào)碼,所以就不需要一個(gè)結(jié)束標(biāo)記:
<web type=”Homepage” url=”http://hongwanfu.126.com” /> |
以上只是對(duì)XML文檔的簡(jiǎn)單描述,如何使用文檔中包含的信息,XML標(biāo)準(zhǔn)體系中有其他的配套標(biāo)準(zhǔn)。
XSL(可擴(kuò)展樣式表語言)是對(duì)CSS的一種擴(kuò)展,功能比CSS強(qiáng)大得多。 XML鏈接是在HTML鏈接的功能之上加以擴(kuò)展,可以支持更為復(fù)雜的鏈接,通過XML鏈接,不僅可以在XML文件之間建立鏈接,還可以建立其他類型數(shù)據(jù)之間的鏈接,其規(guī)范分為三個(gè)部分:XLink語言,XPointer語言和XML Base.
XML標(biāo)準(zhǔn)體系中還有其他很多技術(shù),比如針對(duì)DTD的不足而提出的XML Schema,對(duì)XML文檔進(jìn)行結(jié)構(gòu)話處理的DOM等,由于篇幅的關(guān)系,在這就不一一列舉,不熟悉的請(qǐng)參考有關(guān)書籍。
好了,現(xiàn)在讓我們開始進(jìn)入正題——對(duì)XML的操作。首先,請(qǐng)保證您的電腦中有最新版本的MSXML,微軟XML核心服務(wù)(MSXML)版本4.0提供了從Visual Basic6.0加載和存儲(chǔ)XML文檔的工具。若沒有,請(qǐng)到http://msdn.microsoft.com/xml/default.asp中下載最新版本的MSXML,并安裝在計(jì)算機(jī)上。在Visual Basic 6.0中使用Microsoft XML V4.0對(duì)象引用其他對(duì)象一樣,首先在工程菜單中選擇引用菜單項(xiàng),選擇Microsoft V4.0,單擊OK,一切完成后就現(xiàn)在就可以在VB應(yīng)用程序中添加XML對(duì)象了。如圖:
萬事俱備,我們先用VB和MSXML的COM接口的DOM實(shí)現(xiàn)的一個(gè)例子來對(duì)XML操作進(jìn)行初步的了解吧。
首先聲明下面要用的幾個(gè)對(duì)象的變量:
Dim tempdoc As DOMDocument Dim tempnode As IXMLDOMNode Dim tempelement As IXMLDOMElement Dim tempattribute As IXMLDOMElement Dim root As IXMLDOMElement |
文檔對(duì)象模型(DOM)使用了一系列相應(yīng)的對(duì)象描述了XML文檔的等級(jí)狀態(tài),DOMDocument類是一個(gè)描繪XML文檔的DOM結(jié)構(gòu)的MSXML類。DOMDocument類僅僅提供了很少的幾個(gè)有用的屬性和方法,例如:Load方法載入一個(gè)xml文件,loadxml方法將字符串作為xml數(shù)據(jù)添加到對(duì)象中。DOMDocument的xml屬性返回文檔的xml描述,可以顯示這些返回值看看這些文檔究竟是什么樣子,也可以將它存儲(chǔ)為一個(gè)文件,DOMDocument對(duì)象的documentElement屬性表示文檔數(shù)據(jù)的根結(jié)點(diǎn),通常情況下操作XML文檔都從這里開始。DOMDocument提供了幾種創(chuàng)建新節(jié)點(diǎn)的方法。CreateElement方法為文檔創(chuàng)建一個(gè)新的元素節(jié)點(diǎn),其他創(chuàng)建節(jié)點(diǎn)的方法有createAttribute, createProcessingInstruction, 和 createTextNode,在這里就不一一介紹了。
IXMLDOMNode類描述了一個(gè)節(jié)點(diǎn),該類提供了一系列用于搜索和操縱XML文檔的屬性和方法。selectSingleNode 方法用于搜索指定節(jié)點(diǎn)的后代,用于搜索指定節(jié)點(diǎn)路徑的語言稱為XPATH,XPATH非常棘手,本文就不詳細(xì)說明其規(guī)范了。在IXMLDOMNode對(duì)象中,有許多有用的屬性值:
attributes.節(jié)點(diǎn)屬性集合
nodeName.節(jié)點(diǎn)的標(biāo)記名
nodeTypeString.節(jié)點(diǎn)的類型
ownerDocument.返回DOMDocument對(duì)象包含的節(jié)點(diǎn)
text.表示節(jié)點(diǎn)包含的文本內(nèi)容。如果該節(jié)點(diǎn)包含其他節(jié)點(diǎn),那么text代表了所有節(jié)點(diǎn)的文本內(nèi)容的組合。
xml.給出了節(jié)點(diǎn)的xml內(nèi)容,例如:"<Email>hongwanfu@yahoo.com</Email>".
ChildNodes集合包含了節(jié)點(diǎn)的子節(jié)點(diǎn)。要給節(jié)點(diǎn)增加一個(gè)子節(jié)點(diǎn),首先必須給使用DOMDocument對(duì)象的節(jié)點(diǎn)創(chuàng)建方法,然后將這個(gè)新建的節(jié)點(diǎn)加入到父節(jié)點(diǎn)的childNodes集合中。 ChildNodes集合包含了節(jié)點(diǎn)的子節(jié)點(diǎn)。要給節(jié)點(diǎn)增加一個(gè)子節(jié)點(diǎn),首先必須給使用DOMDocument對(duì)象的節(jié)點(diǎn)創(chuàng)建方法,然后將這個(gè)新建的節(jié)點(diǎn)加入到父節(jié)點(diǎn)的childNodes集合中。
由于每個(gè)節(jié)點(diǎn)類型都有不同的訪問方法和內(nèi)容限制,有時(shí)候使用特定類型的節(jié)點(diǎn)要比使用通用 IXMLDOMNode 對(duì)象更容易。要做到這一點(diǎn),需要使用 IXMLDOMElement 對(duì)象來處理 XML 數(shù)據(jù)元素和屬性。正如元素可以包含 XML 數(shù)據(jù)文件中的子元素、文本、注釋、處理說明、CDATA 部分和實(shí)體引用一樣,IXMLDOMElement 對(duì)象也可以包含 IXMLDOMElement、IXMLDOMText、IXMLDOMComment、IXMLDOMProcessingInstruction、IXMLDOMCDATASection 和 IXMLDOMEntityReference 對(duì)象??梢酝ㄟ^使用 IXMLDOMElement 對(duì)象的 getAttribute 和 setAttribute 方法來訪問屬性;或者通過 IXMLDOMElement 對(duì)象的 attributes 屬性,將屬性作為 IXMLDOMNamedNodeMap 對(duì)象進(jìn)行管理。有關(guān)使用這些方法和對(duì)象的詳細(xì)信息,請(qǐng)參閱 MSXML 4.0 SDK Help。
接下來我們要做的是生成一個(gè)XML DOMDocument 對(duì)象 :
Set tempdoc = New DOMDocument |
生成根節(jié)點(diǎn)并把它設(shè)置為文件的根 :
Set root = tempdoc.createElement("Personal") Set tempdoc.documentElement = root |
生成孩子節(jié)點(diǎn)添加到根節(jié)點(diǎn)上去,并且為這個(gè)節(jié)點(diǎn)設(shè)置一個(gè)屬性 :
Set tempnode = tempdoc.createNode(NODE_ELEMENT, "Web", "") tempnode.Text = " http://hongwanfu.126.com " root.appendChild tempnode |
取得元素節(jié)點(diǎn)的接口,添加屬性:
Set tempelement = tempnode tempelement.setAttribute "Type", "Homepage" |
最后,寫XML文件:
Open "CreateXMLFile.xml" for output as #1 Print #1, root.XML Close #1 |
下面就是上面程序生成的CreateXMLFile.xml文件的內(nèi)容如圖:
熟悉了如何用Visual Basic 6創(chuàng)建XML文件,接下來,我們將編寫一個(gè)程序,使得程序開始運(yùn)行時(shí),程序從XML文件中加載數(shù)據(jù),在程序運(yùn)行結(jié)束時(shí),將程序中的現(xiàn)行值存入XML文件中。
首先,建立一個(gè)名叫Personal.xml的文件:
<?xml version="1.0" encoding="GB2312"?>
<個(gè)人信息>
<姓名>洪萬福</姓名>
<性別>男</性別>
<出生日期>1983年x月x日</出生日期>
<地址>福建省廈門市集美大學(xué)水產(chǎn)學(xué)院新區(qū)270#</地址>
<郵編>361021</郵編>
<QQ>24948251</QQ>
<個(gè)人主頁(yè)>http://hongwanfu.126.com</個(gè)人主頁(yè)>
</個(gè)人信息> |
其中,encoding="GB2312"是為了防止顯示中文時(shí)出現(xiàn)亂碼。
接著,進(jìn)入Visual Basic 6,建立7個(gè)Label和7個(gè)TextBox, 具體如圖:
隨后,編寫如下代碼:
Option Explicit Private p_AppPath As String Private Sub Form_Load() ' 獲得程序運(yùn)行目錄 p_AppPath = App.Path If Right$(p_AppPath, 1) <> "\" Then p_AppPath = p_AppPath & "\" ' 加載值 LoadValues End Sub
Private Sub Form_Unload(Cancel As Integer) ' 保存現(xiàn)有的值 SaveValues End Sub
Private Sub LoadValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode
' 載入文件
Set xml_document = New DOMDocument xml_document.Load p_AppPath & "Personal.xml" If xml_document.documentElement Is Nothing Then
Exit Sub
End If
'尋找節(jié)點(diǎn) Set values_node = xml_document.selectSingleNode("個(gè)人信息") ' 讀取各個(gè)節(jié)點(diǎn)的值 txtName.Text = GetNodeValue(values_node, "姓名", "???") txtSex.Text = GetNodeValue(values_node, "性別", "???") txtBirthday.Text = GetNodeValue(values_node, "出生日期", "???") txtAddress.Text = GetNodeValue(values_node, "地址", "???") txtZip.Text = GetNodeValue(values_node, "郵編", "???") txtQQ.Text = GetNodeValue(values_node, "QQ", "???") txtHomepage.Text = GetNodeValue(values_node, "個(gè)人主頁(yè)", "???")
End Sub
' 返回各個(gè)節(jié)點(diǎn)的值
Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, ByVal node_name As String, _
Optional ByVal default_value As String = "") As String
Dim value_node As IXMLDOMNode Set value_node = start_at_node.selectSingleNode(".//" & node_name) If value_node Is Nothing Then GetNodeValue = default_value Else GetNodeValue = value_node.Text End If
End Function
' 保存現(xiàn)有的值
Private Sub SaveValues() Dim xml_document As DOMDocument Dim values_node As IXMLDOMNode ' 建立XML文件 Set xml_document = New DOMDocument Set values_node = xml_document.createElement("個(gè)人信息") xml_document.appendChild values_node CreateNode values_node, "姓名", txtName.Text CreateNode values_node, "性別", txtSex.Text CreateNode values_node, "出生日期", txtBirthday.Text CreateNode values_node, "地址", txtAddress.Text CreateNode values_node, "郵編", txtZip.Text CreateNode values_node, "QQ", txtQQ.Text CreateNode values_node, "個(gè)人主頁(yè)", txtHomepage.Text ' 保存XML文件 xml_document.save p_AppPath & "Personal.xml" End Sub
Private Sub CreateNode(ByVal parent As IXMLDOMNode, _
ByVal node_name As String, ByVal node_value As String)
Dim new_node As IXMLDOMNode Set new_node = parent.ownerDocument.createElement(node_name) new_node.Text = node_value parent.appendChild new_node End Sub |
運(yùn)行結(jié)果如下:
雖然,MSXML提供了從Visual Basic6.0加載和存儲(chǔ)XML文檔的工具,但是,對(duì)其的應(yīng)用要求程序員對(duì)VB和MSXML的COM接口有一定的認(rèn)識(shí),所以,并不是得到很廣泛的應(yīng)用。
Visual Basic.NET的出現(xiàn)大大改變了這個(gè)狀況,Visual Basic.NET提供了使用XML、XSL以及其他XML工具的完整工具,使用戶很輕松就能實(shí)現(xiàn)XML的應(yīng)用,甚至,在不用編寫代碼的情況下操作XML。
ADO.NET是Microsoft新推出的.NET框架中用于數(shù)據(jù)訪問的組件,其最大的優(yōu)點(diǎn)就是使用XML作為傳送數(shù)據(jù)的標(biāo)準(zhǔn),只要有一個(gè)XML文本,就可以讀入ADO.NET的組件中,然后ADO.NET再以XML格式傳給數(shù)據(jù)庫(kù)或者其他組件。
可以使用DataSet對(duì)象的ReadXML方法將一個(gè)XML文件讀入到DataSet中,這是一個(gè)重載的方法,有幾種語法格式,經(jīng)常用到的如下所示:
其中,F(xiàn)ileName為XML文檔的名字,現(xiàn)在將前面創(chuàng)建的XML文本“Personal.xml”讀入到DataSet中。新建一個(gè)項(xiàng)目,在窗體上創(chuàng)建一個(gè)Button和一個(gè)DataGrid控件,雙擊Button1輸入以下代碼:
Dim ds As New DataSet()
'讀入XML文檔 ds.ReadXml("personal.xml") Dim tb As DataTable Dim dv As DataView tb = ds.Tables(0) dv = New DataView(tb) Me.DataGrid1.DataSource = dv |
顯示結(jié)果如圖:
怎么樣?和剛才比起來,代碼量是不是少了很多,很容易就實(shí)現(xiàn)了XML文件的讀取呢?
.NET框架提供了操作XML文檔和數(shù)據(jù)的一組完整的類。XmlReader和XmlWriter對(duì)象以及這兩個(gè)對(duì)象的派生類提供了讀取XML和可選驗(yàn)證XML的能力。XmlDocument和XMLSchema對(duì)象及其相關(guān)類代表了XML本身,而XslTransform和XMPathNavigator類分別支持XSL轉(zhuǎn)換(XSLT)和應(yīng)XML路徑語言(XPath)查詢。
除了提供操作XML數(shù)據(jù)的外,XML標(biāo)準(zhǔn)還是.NET框 架中數(shù)據(jù)轉(zhuǎn)換和序列化的基礎(chǔ)。多數(shù)時(shí)候這些后臺(tái)進(jìn)行,不過我們已經(jīng)看到ADO.NET類型化數(shù)據(jù)集是使用XML架構(gòu)表示的。
另外,ADO.NET數(shù)據(jù)集類對(duì)讀寫XML數(shù)據(jù)和架構(gòu)提供直接支持,而且XmlDataDocument提供同步XML數(shù)據(jù)和關(guān)系A(chǔ)DO.NET數(shù)據(jù)集的能力,這樣就可以用XML和關(guān)系工具對(duì)數(shù)據(jù)的單個(gè)集合進(jìn)行操作。
.NET框架公開了一個(gè)可用來直接對(duì)XML數(shù)據(jù)進(jìn)行操作的類集。不過,如果需要使用關(guān)系操作(如排序、過濾或檢索相關(guān)行),數(shù)據(jù)集則提供了一個(gè)更簡(jiǎn)便的機(jī)制。此外,XML類不支持?jǐn)?shù)據(jù)綁定,所以如果要向用戶顯示數(shù)據(jù),就必須使用數(shù)據(jù)集的XML方法。
幸運(yùn)的是,將任何一個(gè)給定的數(shù)據(jù)集合作為XML層次結(jié)構(gòu)或關(guān)系數(shù)據(jù)集相互并不排斥。
1.數(shù)據(jù)集支持的最直接的XML方法可能就是GetXml和GetXmlSchema了,這方法只將XML數(shù)據(jù)或XSD架構(gòu)作為一個(gè)字符串值返回。可以用以下代碼來實(shí)現(xiàn):
Dim xmlstr As String xmlStr = Me.dsMasterl.GetXmlSchema() Me.tbResult.Text = xmlStr |
和
Dim xmlstr As String xmlStr = Me.dsMasterl.GetXml Me.tbResult.Text = xmlStr |
2. 數(shù)據(jù)集的ReadXmlSchema方法可從XSD架構(gòu)定義或從XML加載數(shù)據(jù)集架構(gòu)定義。
ReadXmlSchema支持4個(gè)版本的方法??梢詫⒘?、識(shí)別文件名的字符串、TextReader或XmlReader對(duì)象傳遞給方法。
ReadXmlSchema不加載任何數(shù)據(jù),它只加載表、列和約束(鍵和關(guān)系)。如果數(shù)據(jù)集已經(jīng)架構(gòu)信息,新表、列和約束將在必要時(shí)添加到現(xiàn)有架構(gòu)中。如果正讀取的架構(gòu)中定義的對(duì)象與現(xiàn)有數(shù)據(jù)集架構(gòu)沖突,那么ReadXmlSchema方法將會(huì)引發(fā)一個(gè)異常。
Dim newDS As New System.Data.DataSet() newDS.ReadXmlSchema("masterSchema.xsd") Me.daCategories.Fill(newDS.Tables("Categories")) Me.daproducts.Fill(newDS.Tables("Products")) SetBindings(newDS) |
3. 數(shù)據(jù)集的InferXmlSchema方法根據(jù)傳遞給它的XML數(shù)據(jù)的結(jié)構(gòu)派生出數(shù)據(jù)集架構(gòu)。
InferXmlSchema與上一節(jié)介紹的ReadXmlSchema方法的輸入源相同。另外,InferXMLSchema方法接受表示命名空間的字符串?dāng)?shù)組,這個(gè)空間在生成數(shù)據(jù)集架構(gòu)時(shí)應(yīng)被忽略。
Dim newDS As New System.Data.DataSet() Dim nsStr()As string newDS.InferXmlSchema("dataOnly.xml",nsStr)) Me.daCategories.Fill(newDS.Tables("Categories")) Me.daProducts.Fill(newDS.Tables(Products")) newDS.Relations.Add("CategoriesProducts", _ newDS.Tables("Categories").Columns("CategoryID"), _ newDS.Tables("Products").Columns("CategoryID")) |
前兩行代碼聲明了數(shù)據(jù)集和String數(shù)組變量,第3行將結(jié)果傳遞到InferXmlSchema方法中。接下來的代碼給新數(shù)據(jù)集添加并填充了新的數(shù)據(jù)關(guān)系,然后SetBindings函數(shù)將XML窗體控件綁定到數(shù)據(jù)集上。
4.WriteXmlSchema方法將數(shù)據(jù)集架構(gòu)(包括表、列和約束)寫到指定輸出中。這個(gè)方法和其他XML方法一樣,都接受相同的輸出參數(shù)。
Me.dsMaster1.WriteXmlSchema("testSchema.xsd") Messagebox.Show("Finished","WriteXmlSchema") |
5. 與ReadXml類似,數(shù)據(jù)集的WriteXml方法也可將XML數(shù)據(jù)或可選的數(shù)據(jù)集架構(gòu)信息寫到指定輸出中。
Me.daCategories.Fill(Me.dsMaster1.Categories) Me.daProducts.Fill(Me.dsMaster1.Products) Me.dsMaster1.WriteXml("newData.xml", XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished", “WriteXml") |
默認(rèn)情況下,WriteXml方法生成XML,所生成的XML是一般結(jié)構(gòu)來設(shè)置格式的,其中數(shù)據(jù)表的結(jié)構(gòu)作為復(fù)雜類型,數(shù)據(jù)列的結(jié)構(gòu)作為復(fù)雜類型中的元素。這并不一定是所需要的輸出結(jié)果。例如,如果要將數(shù)據(jù)讀回到數(shù)據(jù)集,只有存在架構(gòu)時(shí)(而架構(gòu)在很多情況下都是不很必要的開銷)或者相關(guān)數(shù)據(jù)嵌套在XML層次結(jié)構(gòu)中時(shí),ADO.NET才會(huì)創(chuàng)建正確的關(guān)系。在其他情況下,也許需要控制列是否以元素、必性或簡(jiǎn)單文本方式寫入,或者完全阻止某些列被寫入。比如,在應(yīng)用程序間互換數(shù)據(jù)就可能出會(huì)這種情況。
Me.daCategories.Fill(Me.dsMaster1.Categories) Me.daProducts.Fill(Me.dsMaster1.Products) Me.dsMaster1.Relations("CategoriesProducts").Nested = True Me.dsMaster1.WriteXml("nestedData.xml",XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished","WriteXml Nested") |
數(shù)據(jù)列的ColumnMapping(列映射)屬性控制著WriteXML方法寫入列的方式。ColumnMapping屬性的可能取值。 默認(rèn)值Element將列作為表示數(shù)據(jù)表的復(fù)雜類型內(nèi)的嵌套元素寫入,同時(shí),Attribute將列作為它的必性之一寫入。這兩個(gè)值可以在任何給定的數(shù)據(jù)表內(nèi)混用。Hidden值可防止列寫入。SimpleContent將列作為一個(gè)簡(jiǎn)單文本值寫入,它不能與那些作為元素或?qū)傩詫懭氲牧谢旌希膊荒茉跀?shù)據(jù)關(guān)系的Nested屬性引用一個(gè)將Nested屬性設(shè)置為True的表時(shí)使用。
Me.daCategories.Fill(Me.dsMaster1.Categories) with Me.dsMaster1.Categories .Columns("CategoryID").ColumnMapping = MappingType.Attribute .Columns("CategoryName").ColumnMapping = MappingType.Attribute .Columns("dESCRIPTION").ColumnMapping = MappingType.Attribute End with Me.dsMaster1.WriteXml("attributes.xml", XmlWriteMode.IgnoreSchme) MessageBox.Show("Finished", "Write Attributes") |
6. 雖然關(guān)系數(shù)據(jù)有效,但有些時(shí)候使用XML提供的工具(如XSL(可擴(kuò)展樣式表語言)、XSLT、和XPath)操作一組數(shù)據(jù)會(huì)更方便。
.NET框架的Xml數(shù)據(jù)文檔(XML DataDocument)使之成為可能。Xml數(shù)據(jù)文檔允許將XML結(jié)構(gòu)的數(shù)據(jù)作為數(shù)據(jù)集來操作。它不會(huì)創(chuàng)建一組新數(shù)據(jù),但會(huì)創(chuàng)建一個(gè)引用所有或部分XML數(shù)據(jù)的數(shù)據(jù)集。因?yàn)橹挥幸唤M數(shù)據(jù),在一個(gè)視圖中所作的更改將會(huì)自動(dòng)反映在另一個(gè)視圖中。當(dāng)然存儲(chǔ)資源會(huì)被保存,因?yàn)橹痪S護(hù)了數(shù)據(jù)的一個(gè)副本。
根據(jù)數(shù)據(jù)的初始源的不同,可以基于數(shù)據(jù)集的架構(gòu)和內(nèi)容創(chuàng)建一個(gè)Xml數(shù)據(jù)文檔,或基于Xml數(shù)據(jù)文檔的內(nèi)容創(chuàng)建數(shù)據(jù)集。在任何一種情況下,對(duì)一個(gè)視圖中存數(shù)據(jù)所作的更改將會(huì)映射到另一個(gè)視圖中。
要?jiǎng)?chuàng)建基于現(xiàn)有數(shù)據(jù)集的Xml數(shù)據(jù)文檔,可將數(shù)據(jù)集傳遞給XMLDataDocument構(gòu)造函數(shù):
myXDD = New XmlDataDocument(myDS) |
如果在創(chuàng)建Xml數(shù)據(jù)文檔之前,數(shù)據(jù)集架構(gòu)還未建立,那就必須手動(dòng)建立這兩個(gè)架構(gòu),因?yàn)閷?duì)一個(gè)對(duì)象所作的架構(gòu)更改不會(huì)被傳播給另一個(gè)對(duì)象。反之,若要從XML文檔開始并創(chuàng)建數(shù)據(jù)集,可以使用默認(rèn)的XMLDataDocument構(gòu)造函數(shù),然后引用其數(shù)據(jù)集屬性。
myXdd = New XmlDataDocument() myDS = myXDD.DataSet |
如果使用這個(gè)方法,就必須通過將對(duì)象添加到數(shù)據(jù)集的表數(shù)據(jù)表的列集合來手動(dòng)創(chuàng)建數(shù)據(jù)集架構(gòu)。為了能通過數(shù)據(jù)集使用Xml數(shù)據(jù)文檔的數(shù)據(jù),數(shù)據(jù)表和數(shù)據(jù)列的名稱必須與Xml數(shù)據(jù)文檔中的名稱相匹配,名稱匹區(qū)分大小寫的。
第二種方法需要的代碼稍微多一些,提供了一個(gè)創(chuàng)建XML數(shù)據(jù)部分關(guān)系視圖的機(jī)制。在數(shù)據(jù)集中復(fù)制整個(gè)XML架構(gòu)沒有特殊要求。在數(shù)據(jù)集操作期間,所有不在數(shù)據(jù)集中的數(shù)據(jù)表和數(shù)據(jù)列都會(huì)被忽略。
任何時(shí)候,同步前或同步后,都可將數(shù)據(jù)加載入兩個(gè)文檔中。對(duì)一個(gè)對(duì)象所作的數(shù)據(jù)更改(包括添加、刪除或更改值)都會(huì)被自動(dòng)映射到另一對(duì)象中。
Dim mySDD As System.Xml.XmlDataDocument myXDD = New System.Xml.XmlDataDocument(Me.dsMaster1) myXDD.Load ("dataOnly.xml") SetBindings(Me.dsMaster1) |
.NET框架對(duì)XML操作提供廣泛支持,在System.XML名字空間中可以找到超過150個(gè)類,限于本人水平有限,只研究了XML和ADO.NET數(shù)據(jù)集之間的接口。
總之,無論你喜歡與否,.NET框架都有一個(gè)令人難以拒絕的地方:這是個(gè)嶄新的平臺(tái)。在學(xué)習(xí)的過程中都要投如較多的精力。從現(xiàn)在開始,我們都是初學(xué)者,所以,請(qǐng)大家多多指點(diǎn)。