版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、在ASP.NET中開發(fā) XML DOM紀兆輝(淮海工學院計算機科學系,連云港 222005 )(江蘇連云港新浦區(qū)花果山路59號,E-mail:jzhqjhui)摘要:介紹了在ASP.NET中開發(fā)XML DOM的常用對象類,并結(jié)合程序?qū)嵗f明這些對象類的使用方法。關(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、 簡介 W3C的DOM是在計算機的內(nèi)存中表示XML文檔的一些規(guī)格的集合。DOM是一種與平臺和語言無關(guān)的接口,該接口定義了一系列對象來實現(xiàn)對XML文檔數(shù)據(jù)的訪問和和修改。它允許程序和腳本動態(tài)訪問和修改文檔的內(nèi)容、結(jié)構(gòu)和類型。DOM接口將XML文檔轉(zhuǎn)換為樹型的文檔結(jié)構(gòu)。這棵對象樹是XML文檔內(nèi)元素之間關(guān)系的反映,通過這棵樹,可以訪問和修改XML文
3、檔的數(shù)據(jù)。應用程序可以通過樹型模型,對XML文檔進行層次化的訪問。文檔中的信息,包括數(shù)據(jù)、數(shù)據(jù)的意義和數(shù)據(jù)的關(guān)系都由DOM接口轉(zhuǎn)換為樹型結(jié)構(gòu)的節(jié)點和節(jié)點的關(guān)系,應用程序通過DOM可以通過對樹的各種操作來實現(xiàn)對XML文檔本身的操作。其中包括:n 遍歷樹的所有節(jié)點n 通過DTD或Schema檢查XML文檔的有效性n 訪問樹的節(jié)點,得到所需的節(jié)點信息。比如,節(jié)點的值,屬性節(jié)點的屬性值n 創(chuàng)建新節(jié)點。可以是元素節(jié)點、屬性節(jié)點、注釋節(jié)點、指令節(jié)點或文本節(jié)點n 甚至可以創(chuàng)建全新的XML文檔Microsoft在.NET Framework中通過一些.NET類實現(xiàn)了W3C的 Document Object M
4、odel(DOM),這些類都位于System.xml這個名字空間。其中XmlNode類是一個非常重要的類,它代表了XML文檔中的某個節(jié)點。該節(jié)點可以是XML文檔的根節(jié)點,這樣它就代表整個XML文檔了。它是許多很有用的類的基類,這些類包括插入節(jié)點的類、刪除節(jié)點的類、替換節(jié)點的類以及在XML文檔中完成導航功能的類。同時,XmlNode類還為程序員提供了獲取雙親節(jié)點、子節(jié)點、最后一個子節(jié)點、節(jié)點名稱以及節(jié)點類型等的屬性。它的三個最主要的子類包括:XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument類代表了一個XML文檔,它提供了載入
5、和保存XML文檔的方法和屬性。這些方法包括了Load、LoadXml和Save等。同時,它還提供了添加特性(Attributes)、說明(Comments)、空間(Spaces)、元素(Elements)和新節(jié)點(New Nodes)等XML項的功能。XmlDocumentFragment類代表了一部分XML文檔,它能被用來添加到其他的XML文檔中。XmlDataDocument類可以讓程序員更好地完成和ADO.NET中的數(shù)據(jù)集對象之間的互操作。另外,XPathDocument、XPathNavigator可以更高效地完成在XML文檔中進行查詢、導航等功能。 一個結(jié)點的第1個孩子為 Child
6、Nodes(0), 第2個孩子為 ChildNodes(1),.以產(chǎn)品目錄列表的XML文檔為例: F10 Shimano Calcutta 47.76 F20 Bantam Lexica 49.99 第1個產(chǎn)品(product)元素 表示為: DocumentElement.ChildNodes(0) 類似地,第2個產(chǎn)品的價格表示為:DocumentElement.ChildNodes(1).ChildNodes(2).InnerText。2、XmlDocument對象的使用在.NET Framework中,XmlDocument類封裝了XML DOM對象模型的屬性和方法,它是XML DOM對
7、象模型中的核心類(它等價于COM組件中的MSXML DOMDocument類,兩者的用法也很相似)。在.NET中,DOM的加載機制是建立在XmlReader類上的。當一個XmlDocument對象被加載時,它以一棵樹的形式來組織XML文檔的內(nèi)容,XMLTextReader對象提供了前向的游標,而XmlDocument對象則提供了對于結(jié)點的快速、直接的訪問。然而,一棵DOM樹的構(gòu)造是依賴于緩存的,尤其是對于一個大的XML文檔來講。一旦它被加載以后,我們就可以通過多個屬性和方法遍歷樹中的每個結(jié)點。下面是一些常用的屬性和方法:DocumentElement (文檔樹的根元素), ChildNodes
8、 (一個結(jié)點的所有孩子), FirstChild,LastChild, HasChildNodes, ChildNodes.Count (孩子的個數(shù)), InnerText (文本格式的子樹內(nèi)容), Name (結(jié)點名), NodeType和 Value(文本型結(jié)點的值)等。 如果需要的話,我們可以通過父子的層次關(guān)系來訪問一個結(jié)點。我們給出一例,實現(xiàn)通過XML DOM實現(xiàn)產(chǎn)品信息的選擇。考察一下加載 XmlDocument (DOM樹)的過程。有多種方法來加載 XML Document 對象,我們將使用XmlTextReader對象來加載。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é)點的Inner
10、Text屬性放在一個列表框中。For i = 0 To myDoc.DocumentElement.ChildNodes.Count - 1 lstProducts.Items.Add _ (myDoc.DocumentElement.ChildNodes(i).ChildNodes(1).InnerText)Next i myRdr.Close()接下來,查詢一個選定產(chǎn)品的價格。在” Show Price”按鈕 的click事件中,我們通過一個session變量檢索一棵樹,直接訪問 Price結(jié)點。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對象解析XML文檔一棵樹是由結(jié)點組成的。從本質(zhì)上講,一個結(jié)點也是一棵樹,因為它也包含了所有的下級結(jié)點。底層結(jié)點沒有任何孩子,因此,它最可能是一個文本類型的結(jié)點。我們將采用一個VB.NET的遞歸過程來遍歷一棵樹,通過遍歷DOM樹來顯示包含在每個結(jié)點中的信息。我們將寫兩個過程:1. DisplayNode(node As XmlNode) 它將接收一個結(jié)點(node)并檢驗它是否是一個終端結(jié)點
13、,如果它是一個終端結(jié)點, 這個過程將顯示它的內(nèi)容,如果不是終端結(jié)點,過程將查看它是否有屬性,如果有屬性,將顯示屬性的值。2. TravelDownATree(tree As XmlNode) 它接收一棵樹( tree),先調(diào)用DisplayNode過程,然后把接收到的樹的子樹傳遞給自己。這是一個遞歸的過程,因此,它將探測到接收到的樹的所有結(jié)點。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類的擴展。它在很多方面同XmlDocument類相似。XmlDataDocument對象最具特色的地方是它對同一數(shù)據(jù)提供了兩種視圖: “XML視圖”和”關(guān)系視圖”。 XmlDataDocument有一個 DataSet屬性 ,就是通過這個屬性, XmlDataDocument 把它的數(shù)據(jù)呈現(xiàn)為一個或多個 DataTables。一個 DataTable實際上是XML數(shù)據(jù)的一個虛擬表視圖,一旦加載了XmlDataDocument對象,就把它看作為一棵DOM樹,或通過DataSet屬性我們把它的數(shù)據(jù)看作為一個或多
18、個DataTable。l 加載 XmlDataDocument,檢索指定結(jié)點我們將加載 XmlDataDocument,然后檢索產(chǎn)品名的信息并顯示在一個列表框中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有一定的限制. 首先,整個的文檔需要加載進緩存。經(jīng)常地, 通過DOM樹本身的導航過程顯得有些笨拙。通過數(shù)據(jù)表的關(guān)系視圖也不是很方便。為了解決這些問題,XML.NET
20、提供了XPathDocument和 XpathNavigatorc類。這些類已經(jīng)在W3C XPath 1.0推薦標準中實現(xiàn)。(/TR/xpath).XPathDocument類使得我們不用加載整個DOM樹就能處理XML數(shù)據(jù).而 XPathNavigator 對象可以用來對于XPathDocument 的數(shù)據(jù)進行操作。它還可以用來操作XmlDocument和XmlDataDocument。 它支持導航技術(shù)以便選擇節(jié)點(Node)、在選定的節(jié)點集(NodeList)上遍歷, 以及用多種方式對這些結(jié)點進行復制、 移動和刪除操作。 它使用XPath表達式來完成這些任務。W3C XP
21、ath 1.0 的規(guī)格中勾畫出了從XML文檔中檢索數(shù)據(jù)的查詢語法。它的功用類似于SQL;然而, 它的語法完全不同。初看起來,XPath的查詢語法很復雜。然而通過一定的實踐之后, 你會發(fā)現(xiàn)它在提取XML數(shù)據(jù)方面非常地精煉、便捷。關(guān)于XPath 規(guī)格的細節(jié)已經(jīng)超出了我們的討論范圍。這里我們給出幾個很常用的XPath查詢表達式。 可以用兩種方法構(gòu)造表達式。第一種方式遵循XPath 1.0 的語法。第二種方式遵循XSL模式??紤]下面的文檔A1112Pepsi Beagle1200.89OH- - - - -A7833Frank Horton8964.55MI樣例查詢表達式1: 假設我們需要所有帳戶戶主
22、的名單.以下兩個XPath 表達式都可以完成這一工作:_ 1: descendant:Name_ 2: Bank/Account/Name第一個表達式的意思:所有的名字為Name的后代節(jié)點。第二個表達式的意思:選出所有的Bank結(jié)點下的Account結(jié)點下的Name節(jié)點。 這兩個表達式返回相同的節(jié)點集合。樣例查詢表達式2: 假設我們需要所有來自”O(jiān)hio”的顧客記錄。我們可以使用以下兩個表達式中的一個:_ 1: descendant:Accountchild:State=OH_ 2: Bank/Accountchild:State=OH樣例查詢表達式3:以下任意一個表達式將返回帳戶余額大于50
23、00的所有的”Account”的節(jié)點集合。_1: descendant:Accountchild:Balance 5000_2: Bank/Accountchild:Balance 5000.00樣例查詢表達式4: 假設我們需要那些帳戶名字以”D”打頭的帳戶信息_1: descendant:accountstarts-with(child:Name, D)_2: Bank/Accountstarts-with(child:Name, D)l 使用XPathDocument 和XPathNavigator對象在這一節(jié),我們將使用XPathDocument和 XPathNavigator 對象 從
24、Bank2.xml文件裝填一個列表框,我們將用來自于Ohio的顧客名填充列表框,我們把Bank2.xml作為一個XPathDocument對象進行加載,代碼如下:Dim Doc As New XPathDocument(Server.MapPath(Bank2.xml)在這一階段,我們需要其它的兩個對象: 一個是XPathNavigator用于檢索結(jié)點集;另一個是XPathNodeIterator用于在結(jié)點集的成員中循環(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 這一搜索表達式返回Account結(jié)點集中state取值為”O(jiān)H.”的Name結(jié)點。 為了得到一個特定name結(jié)點中的值,我們需要使用Iterator對象的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對象進行文檔導航這一節(jié)我們將說明怎樣利用一個元素和屬性的值來搜索一個XPathDocument。我們使用Bank3.xml來說明 Bank3.xml的部分語句:Pepsi Beagle1200.89OH- - - - -以上XML文檔的Account元素包含了一個名為AccountNo的屬性和其它的三個元素。在我們的例子中,我們首先填充兩個組合框,一個是帶有帳戶號碼,另一個是帶有帳戶持有者的名字.用戶可以選擇帳戶號碼和
28、名字。在命令按鈕的click事件中,我們將在合適的文本框中顯示余額(Balance)。為了搜索一個屬性中的特定值 (如:AccountNo),我們使用以下表達式:Bank/AccountAccountNo=+accNo+/Balance為了搜索一個元素中的特定值,(如:帳戶的名字),我們使用以下表達式:descendant:Accountchild:Name=+accName+/Balance為了能夠訪問到balance結(jié)點,我們需要調(diào)用Iterator對象的MoveNext方法, 以下的表達式說明了這一點: 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上外版選擇性必修3生物上冊月考試卷含答案
- 2025年新科版九年級歷史下冊月考試卷
- 2025年浙教版選修4地理下冊月考試卷
- 2025年教科新版選修2地理下冊階段測試試卷
- 二零二五年度廣告宣傳攝影合同范本4篇
- 二零二五年度農(nóng)資質(zhì)量安全追溯體系建設合同3篇
- 二零二五年度牛場環(huán)保設施建設與運營合同范本4篇
- 2025年度文物拍賣合同標準版4篇
- 二零二五年度2025版木材加工廢棄物回收利用合同4篇
- 護工合同范本(2篇)
- 2024年湖南高速鐵路職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案解析
- (正式版)SJT 11449-2024 集中空調(diào)電子計費信息系統(tǒng)工程技術(shù)規(guī)范
- 廣州綠色金融發(fā)展現(xiàn)狀及對策的研究
- 《近現(xiàn)代史》義和團運動
- 人教版四年級上冊加減乘除四則混合運算300題及答案
- 合成生物學技術(shù)在生物制藥中的應用
- 消化系統(tǒng)疾病的負性情緒與心理護理
- 高考語文文學類閱讀分類訓練:戲劇類(含答案)
- 協(xié)會監(jiān)事會工作報告大全(12篇)
- WS-T 813-2023 手術(shù)部位標識標準
- 同意更改小孩名字協(xié)議書
評論
0/150
提交評論