在ASPNET中開發(fā)XMLDOM_第1頁
在ASPNET中開發(fā)XMLDOM_第2頁
在ASPNET中開發(fā)XMLDOM_第3頁
在ASPNET中開發(fā)XMLDOM_第4頁
在ASPNET中開發(fā)XMLDOM_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在ASP.NET中開發(fā) XML DOM紀(jì)兆輝(淮海工學(xué)院計(jì)算機(jī)科學(xué)系,連云港 222005 )(江蘇連云港新浦區(qū)花果山路59號(hào),E-mail:jzhqjhui)摘要:介紹了在ASP.NET中開發(fā)XML DOM的常用對(duì)象類,并結(jié)合程序?qū)嵗f明這些對(duì)象類的使用方法。關(guān)鍵詞: ASP.NET DOM XML Exploring XML DOM Within ASP.NETJI Zhaohui(Dept.of Computer Science,Huaihai Institute of Technology,Lianyungang 222005)Abstract:Introduces some clas

2、ses related to XML DOM.Also, some program examples are shown to illustrate how to apply these classes.Keywords:ASP.NET DOM XML1、 簡(jiǎn)介 W3C的DOM是在計(jì)算機(jī)的內(nèi)存中表示XML文檔的一些規(guī)格的集合。DOM是一種與平臺(tái)和語言無關(guān)的接口,該接口定義了一系列對(duì)象來實(shí)現(xiàn)對(duì)XML文檔數(shù)據(jù)的訪問和和修改。它允許程序和腳本動(dòng)態(tài)訪問和修改文檔的內(nèi)容、結(jié)構(gòu)和類型。DOM接口將XML文檔轉(zhuǎn)換為樹型的文檔結(jié)構(gòu)。這棵對(duì)象樹是XML文檔內(nèi)元素之間關(guān)系的反映,通過這棵樹,可以訪問和修改XML文

3、檔的數(shù)據(jù)。應(yīng)用程序可以通過樹型模型,對(duì)XML文檔進(jìn)行層次化的訪問。文檔中的信息,包括數(shù)據(jù)、數(shù)據(jù)的意義和數(shù)據(jù)的關(guān)系都由DOM接口轉(zhuǎn)換為樹型結(jié)構(gòu)的節(jié)點(diǎn)和節(jié)點(diǎn)的關(guān)系,應(yīng)用程序通過DOM可以通過對(duì)樹的各種操作來實(shí)現(xiàn)對(duì)XML文檔本身的操作。其中包括:n 遍歷樹的所有節(jié)點(diǎn)n 通過DTD或Schema檢查XML文檔的有效性n 訪問樹的節(jié)點(diǎn),得到所需的節(jié)點(diǎn)信息。比如,節(jié)點(diǎn)的值,屬性節(jié)點(diǎn)的屬性值n 創(chuàng)建新節(jié)點(diǎn)??梢允窃毓?jié)點(diǎn)、屬性節(jié)點(diǎn)、注釋節(jié)點(diǎn)、指令節(jié)點(diǎn)或文本節(jié)點(diǎn)n 甚至可以創(chuàng)建全新的XML文檔Microsoft在.NET Framework中通過一些.NET類實(shí)現(xiàn)了W3C的 Document Object M

4、odel(DOM),這些類都位于System.xml這個(gè)名字空間。其中XmlNode類是一個(gè)非常重要的類,它代表了XML文檔中的某個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)可以是XML文檔的根節(jié)點(diǎn),這樣它就代表整個(gè)XML文檔了。它是許多很有用的類的基類,這些類包括插入節(jié)點(diǎn)的類、刪除節(jié)點(diǎn)的類、替換節(jié)點(diǎn)的類以及在XML文檔中完成導(dǎo)航功能的類。同時(shí),XmlNode類還為程序員提供了獲取雙親節(jié)點(diǎn)、子節(jié)點(diǎn)、最后一個(gè)子節(jié)點(diǎn)、節(jié)點(diǎn)名稱以及節(jié)點(diǎn)類型等的屬性。它的三個(gè)最主要的子類包括:XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument類代表了一個(gè)XML文檔,它提供了載入

5、和保存XML文檔的方法和屬性。這些方法包括了Load、LoadXml和Save等。同時(shí),它還提供了添加特性(Attributes)、說明(Comments)、空間(Spaces)、元素(Elements)和新節(jié)點(diǎn)(New Nodes)等XML項(xiàng)的功能。XmlDocumentFragment類代表了一部分XML文檔,它能被用來添加到其他的XML文檔中。XmlDataDocument類可以讓程序員更好地完成和ADO.NET中的數(shù)據(jù)集對(duì)象之間的互操作。另外,XPathDocument、XPathNavigator可以更高效地完成在XML文檔中進(jìn)行查詢、導(dǎo)航等功能。 一個(gè)結(jié)點(diǎn)的第1個(gè)孩子為 Child

6、Nodes(0), 第2個(gè)孩子為 ChildNodes(1),.以產(chǎn)品目錄列表的XML文檔為例: F10 Shimano Calcutta 47.76 F20 Bantam Lexica 49.99 第1個(gè)產(chǎn)品(product)元素 表示為: DocumentElement.ChildNodes(0) 類似地,第2個(gè)產(chǎn)品的價(jià)格表示為:DocumentElement.ChildNodes(1).ChildNodes(2).InnerText。2、XmlDocument對(duì)象的使用在.NET Framework中,XmlDocument類封裝了XML DOM對(duì)象模型的屬性和方法,它是XML DOM對(duì)

7、象模型中的核心類(它等價(jià)于COM組件中的MSXML DOMDocument類,兩者的用法也很相似)。在.NET中,DOM的加載機(jī)制是建立在XmlReader類上的。當(dāng)一個(gè)XmlDocument對(duì)象被加載時(shí),它以一棵樹的形式來組織XML文檔的內(nèi)容,XMLTextReader對(duì)象提供了前向的游標(biāo),而XmlDocument對(duì)象則提供了對(duì)于結(jié)點(diǎn)的快速、直接的訪問。然而,一棵DOM樹的構(gòu)造是依賴于緩存的,尤其是對(duì)于一個(gè)大的XML文檔來講。一旦它被加載以后,我們就可以通過多個(gè)屬性和方法遍歷樹中的每個(gè)結(jié)點(diǎn)。下面是一些常用的屬性和方法:DocumentElement (文檔樹的根元素), ChildNodes

8、 (一個(gè)結(jié)點(diǎn)的所有孩子), FirstChild,LastChild, HasChildNodes, ChildNodes.Count (孩子的個(gè)數(shù)), InnerText (文本格式的子樹內(nèi)容), Name (結(jié)點(diǎn)名), NodeType和 Value(文本型結(jié)點(diǎn)的值)等。 如果需要的話,我們可以通過父子的層次關(guān)系來訪問一個(gè)結(jié)點(diǎn)。我們給出一例,實(shí)現(xiàn)通過XML DOM實(shí)現(xiàn)產(chǎn)品信息的選擇??疾煲幌录虞d XmlDocument (DOM樹)的過程。有多種方法來加載 XML Document 對(duì)象,我們將使用XmlTextReader對(duì)象來加載。Private Sub Page_Load(s As

9、Object, e As EventArgs) If Not Page.IsPostBack Then Dim myDoc As New XmlDocument() Dim myRdr As New XmlTextReader(Server.MapPath(Catalog2.xml) myRdr.WhitespaceHandling = WhitespaceHandling.None myDoc.Load(myRdr) Session(sessionDoc) = myDoc Put it in a session variable一旦一棵樹被加載,就可以把ProductName結(jié)點(diǎn)的Inner

10、Text屬性放在一個(gè)列表框中。For i = 0 To myDoc.DocumentElement.ChildNodes.Count - 1 lstProducts.Items.Add _ (myDoc.DocumentElement.ChildNodes(i).ChildNodes(1).InnerText)Next i myRdr.Close()接下來,查詢一個(gè)選定產(chǎn)品的價(jià)格。在” Show Price”按鈕 的click事件中,我們通過一個(gè)session變量檢索一棵樹,直接訪問 Price結(jié)點(diǎn)。Private Sub showPrice(s As Object, e As EventAr

11、gs) Dim i As Integer Dim qty As Integer = 1 Dim price As Double Dim myDoc As New XmlDocument() myDoc = Session(sessionDoc) i = lstProducts.SelectedIndex The Row number selected qty = Integer.Parse(txtQty.Text) price = Double.Parse _ (myDoc.DocumentElement.ChildNodes(i).ChildNodes(2).InnerText) lblPr

12、ice.Text = FormatCurrency(price)www. lblAmount.Text = FormatCurrency(qty * price)End Sub3、使用 XmlDocument對(duì)象解析XML文檔一棵樹是由結(jié)點(diǎn)組成的。從本質(zhì)上講,一個(gè)結(jié)點(diǎn)也是一棵樹,因?yàn)樗舶怂械南录?jí)結(jié)點(diǎn)。底層結(jié)點(diǎn)沒有任何孩子,因此,它最可能是一個(gè)文本類型的結(jié)點(diǎn)。我們將采用一個(gè)VB.NET的遞歸過程來遍歷一棵樹,通過遍歷DOM樹來顯示包含在每個(gè)結(jié)點(diǎn)中的信息。我們將寫兩個(gè)過程:1. DisplayNode(node As XmlNode) 它將接收一個(gè)結(jié)點(diǎn)(node)并檢驗(yàn)它是否是一個(gè)終端結(jié)點(diǎn)

13、,如果它是一個(gè)終端結(jié)點(diǎn), 這個(gè)過程將顯示它的內(nèi)容,如果不是終端結(jié)點(diǎn),過程將查看它是否有屬性,如果有屬性,將顯示屬性的值。2. TravelDownATree(tree As XmlNode) 它接收一棵樹( tree),先調(diào)用DisplayNode過程,然后把接收到的樹的子樹傳遞給自己。這是一個(gè)遞歸的過程,因此,它將探測(cè)到接收到的樹的所有結(jié)點(diǎn)。Sub Page_Load(s As Object, e As EventArgs)If Not Page.IsPostBack Then Dim myXmlDoc As New XmlDocument() Dim myRdr As New XmlTex

14、tReader(Server.MapPath(Catalog2.xml) myRdr.WhitespaceHandling = WhitespaceHandling.None myXmlDoc.Load (myRdr) TravelDownATree(myXmlDoc.DocumentElement) myRdr.Close()End IfEnd SubSub TravelDownATree(tree As XMLNode) If Not IsNothing(tree) Then DisplayNode(tree) End If If tree.HasChildNodes Then tree

15、= tree.FirstChild While Not IsNothing(tree) TravelDownATree(tree) /Call itself and pass the subtree tree = tree.NextSibling End While End IfEnd SubSub DisplayNode(node As XmlNode) If Not node.HasChildNodes Thenww.sResponse.Write( Name= + node.Name + Type= _ + node.NodeType.ToString()+ Value= +node.V

16、alue +) Else Response.Write(Name= + node.Name + Type= _ + node.NodeType.ToString() + ) If node.NodeType = XmlNodeType.Element Then Dim x As XmlAttribute For each x In node.Attributes Response.Write(Name= + x.Name + Type = _ + x.NodeType.ToString()+ Value = +x.Value +) Next End If End IfEnd Sub4、使用Xm

17、lDataDocument 類 XmlDataDocument類是XmlDocument類的擴(kuò)展。它在很多方面同XmlDocument類相似。XmlDataDocument對(duì)象最具特色的地方是它對(duì)同一數(shù)據(jù)提供了兩種視圖: “XML視圖”和”關(guān)系視圖”。 XmlDataDocument有一個(gè) DataSet屬性 ,就是通過這個(gè)屬性, XmlDataDocument 把它的數(shù)據(jù)呈現(xiàn)為一個(gè)或多個(gè) DataTables。一個(gè) DataTable實(shí)際上是XML數(shù)據(jù)的一個(gè)虛擬表視圖,一旦加載了XmlDataDocument對(duì)象,就把它看作為一棵DOM樹,或通過DataSet屬性我們把它的數(shù)據(jù)看作為一個(gè)或多

18、個(gè)DataTable。l 加載 XmlDataDocument,檢索指定結(jié)點(diǎn)我們將加載 XmlDataDocument,然后檢索產(chǎn)品名的信息并顯示在一個(gè)列表框中Select a Product: Sub Page_Load(s As Object, e As EventArgs) If Not Page.IsPostBack Then Dim myDataDoc As New XmlDataDocument() myDataDoc.Load(Server.MapPath(Catalog2.xml) Dim productNames As XmlNodeList productNames= my

19、DataDoc.GetElementsByTagName(ProductName) Dim x As XmlNode For Each x In productNames lstProducts.Items.Add (x.FirstChild().Value) Next End IfEnd Sub5、使用XpathDocument和XpathNavigator查詢XML數(shù)據(jù) XmlDocument 和 XmlDataDocument有一定的限制. 首先,整個(gè)的文檔需要加載進(jìn)緩存。經(jīng)常地, 通過DOM樹本身的導(dǎo)航過程顯得有些笨拙。通過數(shù)據(jù)表的關(guān)系視圖也不是很方便。為了解決這些問題,XML.NET

20、提供了XPathDocument和 XpathNavigatorc類。這些類已經(jīng)在W3C XPath 1.0推薦標(biāo)準(zhǔn)中實(shí)現(xiàn)。(/TR/xpath).XPathDocument類使得我們不用加載整個(gè)DOM樹就能處理XML數(shù)據(jù).而 XPathNavigator 對(duì)象可以用來對(duì)于XPathDocument 的數(shù)據(jù)進(jìn)行操作。它還可以用來操作XmlDocument和XmlDataDocument。 它支持導(dǎo)航技術(shù)以便選擇節(jié)點(diǎn)(Node)、在選定的節(jié)點(diǎn)集(NodeList)上遍歷, 以及用多種方式對(duì)這些結(jié)點(diǎn)進(jìn)行復(fù)制、 移動(dòng)和刪除操作。 它使用XPath表達(dá)式來完成這些任務(wù)。W3C XP

21、ath 1.0 的規(guī)格中勾畫出了從XML文檔中檢索數(shù)據(jù)的查詢語法。它的功用類似于SQL;然而, 它的語法完全不同。初看起來,XPath的查詢語法很復(fù)雜。然而通過一定的實(shí)踐之后, 你會(huì)發(fā)現(xiàn)它在提取XML數(shù)據(jù)方面非常地精煉、便捷。關(guān)于XPath 規(guī)格的細(xì)節(jié)已經(jīng)超出了我們的討論范圍。這里我們給出幾個(gè)很常用的XPath查詢表達(dá)式。 可以用兩種方法構(gòu)造表達(dá)式。第一種方式遵循XPath 1.0 的語法。第二種方式遵循XSL模式??紤]下面的文檔A1112Pepsi Beagle1200.89OH- - - - -A7833Frank Horton8964.55MI樣例查詢表達(dá)式1: 假設(shè)我們需要所有帳戶戶主

22、的名單.以下兩個(gè)XPath 表達(dá)式都可以完成這一工作:_ 1: descendant:Name_ 2: Bank/Account/Name第一個(gè)表達(dá)式的意思:所有的名字為Name的后代節(jié)點(diǎn)。第二個(gè)表達(dá)式的意思:選出所有的Bank結(jié)點(diǎn)下的Account結(jié)點(diǎn)下的Name節(jié)點(diǎn)。 這兩個(gè)表達(dá)式返回相同的節(jié)點(diǎn)集合。樣例查詢表達(dá)式2: 假設(shè)我們需要所有來自”O(jiān)hio”的顧客記錄。我們可以使用以下兩個(gè)表達(dá)式中的一個(gè):_ 1: descendant:Accountchild:State=OH_ 2: Bank/Accountchild:State=OH樣例查詢表達(dá)式3:以下任意一個(gè)表達(dá)式將返回帳戶余額大于50

23、00的所有的”Account”的節(jié)點(diǎn)集合。_1: descendant:Accountchild:Balance 5000_2: Bank/Accountchild:Balance 5000.00樣例查詢表達(dá)式4: 假設(shè)我們需要那些帳戶名字以”D”打頭的帳戶信息_1: descendant:accountstarts-with(child:Name, D)_2: Bank/Accountstarts-with(child:Name, D)l 使用XPathDocument 和XPathNavigator對(duì)象在這一節(jié),我們將使用XPathDocument和 XPathNavigator 對(duì)象 從

24、Bank2.xml文件裝填一個(gè)列表框,我們將用來自于Ohio的顧客名填充列表框,我們把Bank2.xml作為一個(gè)XPathDocument對(duì)象進(jìn)行加載,代碼如下:Dim Doc As New XPathDocument(Server.MapPath(Bank2.xml)在這一階段,我們需要其它的兩個(gè)對(duì)象: 一個(gè)是XPathNavigator用于檢索結(jié)點(diǎn)集;另一個(gè)是XPathNodeIterator用于在結(jié)點(diǎn)集的成員中循環(huán)遍歷,定義如下: Dim myNav As XPathNavigatormyNav= myDoc.CreateNavigator()Dim myIter As XPathNod

25、eIteratormyIter=myNav.Select(Bank/Accountchild:State=OH/Name)Bank/Accountchild:State=OH/Name 這一搜索表達(dá)式返回Account結(jié)點(diǎn)集中state取值為”O(jiān)H.”的Name結(jié)點(diǎn)。 為了得到一個(gè)特定name結(jié)點(diǎn)中的值,我們需要使用Iterator對(duì)象的Current.Value屬性,這樣以下的代碼就可填充我們的列表框:While (myIter.MoveNext()lstName.Items.Add(myIter.Current.Value)End WhileXPathDoc1.aspx的完整代碼如下:wQ

26、uery ExamplesCustomers From Ohio:  Sub showNames(s As Object, e As EventArgs)Dim Doc As New XPathDocument(Server.MapPath(Bank2.xml)Dim myNav As XPathNavigatormyNav=Doc.CreateNavigator()Dim myIter As XPathNodeIteratormyIter=myNav.Select(Bank/Accountchild:State=OH/Name)While (myIter.MoveNext

27、()lstName1.Items.Add(myIter.Current.Value)End WhileEnd Sub 使用XPathDocument和XPathNavigator對(duì)象進(jìn)行文檔導(dǎo)航這一節(jié)我們將說明怎樣利用一個(gè)元素和屬性的值來搜索一個(gè)XPathDocument。我們使用Bank3.xml來說明 Bank3.xml的部分語句:Pepsi Beagle1200.89OH- - - - -以上XML文檔的Account元素包含了一個(gè)名為AccountNo的屬性和其它的三個(gè)元素。在我們的例子中,我們首先填充兩個(gè)組合框,一個(gè)是帶有帳戶號(hào)碼,另一個(gè)是帶有帳戶持有者的名字.用戶可以選擇帳戶號(hào)碼和

28、名字。在命令按鈕的click事件中,我們將在合適的文本框中顯示余額(Balance)。為了搜索一個(gè)屬性中的特定值 (如:AccountNo),我們使用以下表達(dá)式:Bank/AccountAccountNo=+accNo+/Balance為了搜索一個(gè)元素中的特定值,(如:帳戶的名字),我們使用以下表達(dá)式:descendant:Accountchild:Name=+accName+/Balance為了能夠訪問到balance結(jié)點(diǎn),我們需要調(diào)用Iterator對(duì)象的MoveNext方法, 以下的表達(dá)式說明了這一點(diǎn): Bank/AccountAccountNo=+accNo+/Balance完整的XP

29、athDoc2.aspx代碼:Balance Inquiry ScreenSelect an Account Number:  Balance from Account Number Search:   Select an Customer Name:  Balance from Customer Name Search :   wwwIf Not Page.IsPostBack ThenDim myDoc As New XPathDocument(Server.MapPath(Bank3.xm

30、l)Dim myNav As XPathNavigatormyNav=myDoc.CreateNavigator()Dim myIter As XPathNodeIterator Populate the DropDownList with Account Number valuesmyIter=myNav.Select(/*) Load all attributesWhile (myIter.MoveNext()cboAcno.Items.Add(myIter.Current.Value)End While Populate the DropDown list with the name valuesmyIter=

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論