在ASPNET中开发XMLDOM_第1页
在ASPNET中开发XMLDOM_第2页
在ASPNET中开发XMLDOM_第3页
在ASPNET中开发XMLDOM_第4页
在ASPNET中开发XMLDOM_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在ASP.NET中开发 XML DOM纪兆辉(淮海工学院计算机科学系,连云港 222005 )(江苏连云港新浦区花果山路59号,E-mail:jzhqjhui)摘要:介绍了在ASP.NET中开发XML DOM的常用对象类,并结合程序实例说明这些对象类的使用方法。关键词: 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是在计算机的内存中表示XML文档的一些规格的集合。DOM是一种与平台和语言无关的接口,该接口定义了一系列对象来实现对XML文档数据的访问和和修改。它允许程序和脚本动态访问和修改文档的内容、结构和类型。DOM接口将XML文档转换为树型的文档结构。这棵对象树是XML文档内元素之间关系的反映,通过这棵树,可以访问和修改XML文

3、档的数据。应用程序可以通过树型模型,对XML文档进行层次化的访问。文档中的信息,包括数据、数据的意义和数据的关系都由DOM接口转换为树型结构的节点和节点的关系,应用程序通过DOM可以通过对树的各种操作来实现对XML文档本身的操作。其中包括:n 遍历树的所有节点n 通过DTD或Schema检查XML文档的有效性n 访问树的节点,得到所需的节点信息。比如,节点的值,属性节点的属性值n 创建新节点。可以是元素节点、属性节点、注释节点、指令节点或文本节点n 甚至可以创建全新的XML文档Microsoft在.NET Framework中通过一些.NET类实现了W3C的 Document Object M

4、odel(DOM),这些类都位于System.xml这个名字空间。其中XmlNode类是一个非常重要的类,它代表了XML文档中的某个节点。该节点可以是XML文档的根节点,这样它就代表整个XML文档了。它是许多很有用的类的基类,这些类包括插入节点的类、删除节点的类、替换节点的类以及在XML文档中完成导航功能的类。同时,XmlNode类还为程序员提供了获取双亲节点、子节点、最后一个子节点、节点名称以及节点类型等的属性。它的三个最主要的子类包括:XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument类代表了一个XML文档,它提供了载入

5、和保存XML文档的方法和属性。这些方法包括了Load、LoadXml和Save等。同时,它还提供了添加特性(Attributes)、说明(Comments)、空间(Spaces)、元素(Elements)和新节点(New Nodes)等XML项的功能。XmlDocumentFragment类代表了一部分XML文档,它能被用来添加到其他的XML文档中。XmlDataDocument类可以让程序员更好地完成和ADO.NET中的数据集对象之间的互操作。另外,XPathDocument、XPathNavigator可以更高效地完成在XML文档中进行查询、导航等功能。 一个结点的第1个孩子为 Child

6、Nodes(0), 第2个孩子为 ChildNodes(1),.以产品目录列表的XML文档为例: F10 Shimano Calcutta 47.76 F20 Bantam Lexica 49.99 第1个产品(product)元素 表示为: DocumentElement.ChildNodes(0) 类似地,第2个产品的价格表示为:DocumentElement.ChildNodes(1).ChildNodes(2).InnerText。2、XmlDocument对象的使用在.NET Framework中,XmlDocument类封装了XML DOM对象模型的属性和方法,它是XML DOM对

7、象模型中的核心类(它等价于COM组件中的MSXML DOMDocument类,两者的用法也很相似)。在.NET中,DOM的加载机制是建立在XmlReader类上的。当一个XmlDocument对象被加载时,它以一棵树的形式来组织XML文档的内容,XMLTextReader对象提供了前向的游标,而XmlDocument对象则提供了对于结点的快速、直接的访问。然而,一棵DOM树的构造是依赖于缓存的,尤其是对于一个大的XML文档来讲。一旦它被加载以后,我们就可以通过多个属性和方法遍历树中的每个结点。下面是一些常用的属性和方法:DocumentElement (文档树的根元素), ChildNodes

8、 (一个结点的所有孩子), FirstChild,LastChild, HasChildNodes, ChildNodes.Count (孩子的个数), InnerText (文本格式的子树内容), Name (结点名), NodeType和 Value(文本型结点的值)等。 如果需要的话,我们可以通过父子的层次关系来访问一个结点。我们给出一例,实现通过XML DOM实现产品信息的选择。考察一下加载 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结点的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()接下来,查询一个选定产品的价格。在” Show Price”按钮 的click事件中,我们通过一个session变量检索一棵树,直接访问 Price结点。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文档一棵树是由结点组成的。从本质上讲,一个结点也是一棵树,因为它也包含了所有的下级结点。底层结点没有任何孩子,因此,它最可能是一个文本类型的结点。我们将采用一个VB.NET的递归过程来遍历一棵树,通过遍历DOM树来显示包含在每个结点中的信息。我们将写两个过程:1. DisplayNode(node As XmlNode) 它将接收一个结点(node)并检验它是否是一个终端结点

13、,如果它是一个终端结点, 这个过程将显示它的内容,如果不是终端结点,过程将查看它是否有属性,如果有属性,将显示属性的值。2. TravelDownATree(tree As XmlNode) 它接收一棵树( tree),先调用DisplayNode过程,然后把接收到的树的子树传递给自己。这是一个递归的过程,因此,它将探测到接收到的树的所有结点。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对象最具特色的地方是它对同一数据提供了两种视图: “XML视图”和”关系视图”。 XmlDataDocument有一个 DataSet属性 ,就是通过这个属性, XmlDataDocument 把它的数据呈现为一个或多个 DataTables。一个 DataTable实际上是XML数据的一个虚拟表视图,一旦加载了XmlDataDocument对象,就把它看作为一棵DOM树,或通过DataSet属性我们把它的数据看作为一个或多

18、个DataTable。l 加载 XmlDataDocument,检索指定结点我们将加载 XmlDataDocument,然后检索产品名的信息并显示在一个列表框中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数据 XmlDocument 和 XmlDataDocument有一定的限制. 首先,整个的文档需要加载进缓存。经常地, 通过DOM树本身的导航过程显得有些笨拙。通过数据表的关系视图也不是很方便。为了解决这些问题,XML.NET

20、提供了XPathDocument和 XpathNavigatorc类。这些类已经在W3C XPath 1.0推荐标准中实现。(/TR/xpath).XPathDocument类使得我们不用加载整个DOM树就能处理XML数据.而 XPathNavigator 对象可以用来对于XPathDocument 的数据进行操作。它还可以用来操作XmlDocument和XmlDataDocument。 它支持导航技术以便选择节点(Node)、在选定的节点集(NodeList)上遍历, 以及用多种方式对这些结点进行复制、 移动和删除操作。 它使用XPath表达式来完成这些任务。W3C XP

21、ath 1.0 的规格中勾画出了从XML文档中检索数据的查询语法。它的功用类似于SQL;然而, 它的语法完全不同。初看起来,XPath的查询语法很复杂。然而通过一定的实践之后, 你会发现它在提取XML数据方面非常地精炼、便捷。关于XPath 规格的细节已经超出了我们的讨论范围。这里我们给出几个很常用的XPath查询表达式。 可以用两种方法构造表达式。第一种方式遵循XPath 1.0 的语法。第二种方式遵循XSL模式。考虑下面的文档A1112Pepsi Beagle1200.89OH- - - - -A7833Frank Horton8964.55MI样例查询表达式1: 假设我们需要所有帐户户主

22、的名单.以下两个XPath 表达式都可以完成这一工作:_ 1: descendant:Name_ 2: Bank/Account/Name第一个表达式的意思:所有的名字为Name的后代节点。第二个表达式的意思:选出所有的Bank结点下的Account结点下的Name节点。 这两个表达式返回相同的节点集合。样例查询表达式2: 假设我们需要所有来自”Ohio”的顾客记录。我们可以使用以下两个表达式中的一个:_ 1: descendant:Accountchild:State=OH_ 2: Bank/Accountchild:State=OH样例查询表达式3:以下任意一个表达式将返回帐户余额大于50

23、00的所有的”Account”的节点集合。_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对象在这一节,我们将使用XPathDocument和 XPathNavigator 对象 从

24、Bank2.xml文件装填一个列表框,我们将用来自于Ohio的顾客名填充列表框,我们把Bank2.xml作为一个XPathDocument对象进行加载,代码如下:Dim Doc As New XPathDocument(Server.MapPath(Bank2.xml)在这一阶段,我们需要其它的两个对象: 一个是XPathNavigator用于检索结点集;另一个是XPathNodeIterator用于在结点集的成员中循环遍历,定义如下: 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结点集中state取值为”OH.”的Name结点。 为了得到一个特定name结点中的值,我们需要使用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对象进行文档导航这一节我们将说明怎样利用一个元素和属性的值来搜索一个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结点,我们需要调用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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论