首页 第14章.ASP.NET XML和Web Service

第14章.ASP.NET XML和Web Service

举报
开通vip

第14章.ASP.NET XML和Web Service第2章 认识C# 3 第14章 ASP.NET XML和Web Service 在上一章中讲到的Web.config配置文件就是基于XML文件格式的,XML(Extensible Markup Language,可扩展标记语句)是一种描述数据和数据结构的语言,XML文本可以保存在任何存储文本中,这就让XML具有了可扩展性、跨平台型以及传输与存储方面的优点。 14.1 XML简介 标记语言(Markup Language)特指一系列约定好的标记来对电子文档进行标记,以实现对电子文档的语义、结构以及格式的定义。在AS...

第14章.ASP.NET XML和Web Service
第2章 认识C# 3 第14章 ASP.NET XML和Web Service 在上一章中讲到的Web.config配置文件就是基于XML文件格式的,XML(Extensible Markup Language,可扩展标记语句)是一种描述数据和数据结构的语言,XML文本可以保存在任何存储文本中,这就让XML具有了可扩展性、跨平台型以及传输与存储方面的优点。 14.1 XML简介 标记语言(Markup Language)特指一系列约定好的标记来对电子文档进行标记,以实现对电子文档的语义、结构以及格式的定义。在ASP.NET开发中,最常用的标记语言就是HTML,HTML标记语言定义了HTML文档的语义、结构以及格式,以便在不同的浏览器中所呈现的内容是一致的。XML标记语言与SGML和HTML都属于标记语言,标记语言的发展如图14-1所示。 图14-1 标记语言的发展史 为了更加方便的适应互联网的需求,1996年开始创建XML标记语言。XML标记语言不仅具备了SGML标记语言强大的扩展性,同样也具备HTML标记语言的易用性。不仅如此,ASP.NET还将XML作为应用程序数据存储和传输的重要方法。 在当今互联网中,Web应用已经成为一种分布式组件技术。传统的Web应用技术解决的问题是如何让人使用Web提供的应用,而当今的Web应用技术是要解决如何让应用程序使用Web应用。由于Web应用能够跨平台、跨语言的为应用程序提供服务,所以Web应用和XML应用的前景是非常广阔的。 注意:这里所说的Web应用的跨平台是针对浏览器而言,Windows能够浏览一个Web应用,而Linux同样可以浏览一个Web应用。 14.2 读写XML XML和HTML都是基于SGML(Standard Generalized Markup Language,标准通用标记语言)的,但是XML和HTML却有着很大的区别,这些区别不仅仅在于格式上的区别,还在于使用性、可扩展性等等。 14.2.1 XML与HTML XML标记语言和HTML标记语言有着极大的不同,在应用程序开发中,XML标记语言能够适应于大部分的应用程序环境和开发需求。这些需求是HTML标记语言无法做到的,XML标记语言和HTML标记语言的具体区别如下所示。 ​ HTML标记是固定的,并且是没有层次的,在HTML文档中,用户无法自行创建标签,例如这样的标签浏览器很可能解析不了,HTML中标记的作用是描述数据的显示方式,这种方式只能交付给浏览器进行处理,而HTML文档中的标记都是独立存在的,没有层次。 ​ XML的标记不是固定的且是有层次的,在XML文档中,用户可以自行创建标签,例如这样的标签,XML标记不能够描述网页的外观和内容,XML只能够描述内容的数据结构和层次,在浏览器中浏览XML文档,也可以发现XML标记是有层次的。 在Visual Studio 2008中,.NET Framework提供了System.XML命名空间,该命名空间提供了一组可扩展类使得开发人员能够轻松的读、写、以及编辑XML文本。 14.2.2 创建XML文档 使用Visual Studio 2008能够创建XML文档,创建和使用XML文档无需XML语法分析器来专门负责分析语法,在.NET Framework中已经集成了可扩展类。右击现有项,单击【添加新项】选项,选择XML文件,如图14-2所示。 图14-2 创建XML文档 创建完成后,就需要向XML文档中编写XML标记,以下是一个完整的XML文档示例。 武汉电脑城 123456789 J.Dan Bill Gates 武汉电脑城 123456789 Bill Gates PC STORE 123456789 J.Dan Bill Gates Windows Mobile Store 123456789 Bill Gates 上述XML文档使用了自定义标记对商城进行了描述,包括商城所在地、商城名称、电话号码以及负责人等。编写XML文档时,开发人员能够自定义标签进行文档描述,但是在XML文档的头部必须进行XML文档声明,示例代码如下所示。 上述代码在XML文档头部进行了声明,表示该文档是一个XML文档,并且说明该文档的版本为1.0的XML文档,该文档还可以包含一个encoding属性,指明文档中的编码类型。声明该文档是一个XML文档后,则需要在XML文档中编写根标记,这个标记可以是开发人员自定义标记名称,在这里被命名为Root,示例代码如下。 上述代码创建了一个根标记,在这里命名为Root。在XML文档中,所有的标记都应该被包含在一个根标记中,这样不仅方便描述也方便查阅。XML文档中的根标记不能够重复使用,如果重复使用则会提示异常。 在根标记内,应该编写需要描述的信息的标记。在这里,描述一个商城需要的一些属性,包括商城所在的州、所在地以及商城的主营类型等,通过XML标记语言可以自行创建标记来描述,示例代码如下所示。 //地区描述 //位置描述 PC STORE //商城名称 123456789 //商城电话 J.Dan //商城销售人员 Bill Gates Windows Mobile Store 123456789 Bill Gates 上述代码对商城的信息进行了描述,这些标签的意义如下所示: ​ ShopInformation:商城信息,包括area属性来描述所在州或板块,这里说明了是在USA地区。 ​ Shop:商城在该板块的所在州、省市等信息。 ​ Name:商城的名称。 ​ Phone:商城的联系电话。 ​ Seller:商城的销售人员。 这些标签都是用户自定义的,XML文档允许开发人员自定义标签并,另外,XML文档也不局限所要描述的对象格式。例如当上述代码也可以编写另外一种样式时,同样能够被XML所识别,示例代码如下所示。 //另一种地区表示方式 PC STORE 123456789 J.Dan Bill Gates S.K //地区直接放在描述中 Windows Mobile Store 123456789 Bill Gates S 技巧:良好的缩进能够让XML文档更加方便阅读,同时XML文档是大小写敏感的,对于XML标记,标记头和标记尾的大小写规则必须匹配。 14.2.3 XML控件 在ASP.NET中提供了针对XML读写的控件XML控件,XML控件可以很好的解决XML文档的显示问题,如果需要浏览XML文档的数据,则只需要编写XML控件中的DocumentSource属性即可,示例代码如下所示。
//使用XML控件
运行后如图14-3所示。 图14-3 XML控件 运行后会发现XML文档的内容都显示出来了,但是却没有层次感,因为XML控件并没有把记录分开,而是连续的呈现XML文档的内容。如果需要按照规范或开发人员的意愿呈现给浏览器,则必须使用XSL样式表。 14.2.4 XML文件读取类(XmlTextReader) XmlTextReader类属于System.Xml命名空间,XmlTextReader类提供对XML数据的快速、单项、无缓冲的数据读取功能,因为XmlTextReader类是基于流的,所以使用XmlTextReader类读取XML内容只能够从前向后读取,而不能逆向读取。 因为XmlTextReader类的流形式,节约了读取XML文档的时间,也大量的节约了读取XML所需花费的内存空间,当需要读取XML节点时,只需要使用XmlTextReader类的Read()方法即可,示例代码如下所示。 XmlTextReader rd = new XmlTextReader(Server.MapPath("XMLFile1.xml")); //构造函数 while (rd.Read()) //遍历节点 { Response.Write("Node Type is : " + rd.NodeType +" 
"); //输出Node Response.Write("Name is : " + rd.Name + " 
"); //输出Name Response.Write("Value is :" + rd.Value + " 
"); //输出Value Response.Write("
"); } 上述代码使用XmlTextReader类的构造函数创建了XmlTextReader对象,并通过使用XmlTextReader类的Read()方法进行XmlTextReader对象的遍历。遍历XML文档后,需要使用Close方法进行XmlTextReader对象的关闭操作,这一点是非常重要的,如果不使用XmlTextReader类的Close方法,则相应的XML文件正在被进程使用,只有使用了Close方法才能将相应的文件关闭掉。示例代码如下所示。 rd.Close(); //关闭Reader XmlTextReader类遍历XML文件运行结果如图14-4所示。 图14-4 XmlTextReader类遍历XML文件 在使用XmlTextReader类读取XML文件中相应的节点时,XmlTextReader类的NodeType会检查节点的类型,而XmlTextReader类的Name和Value会分别检查节点的名称和值,相应的XML代码如下所示。 武汉电脑城 123456789 J.Dan Bill Gates 上述代码中,使用XmlTextReader类进行读取,则Shop节点的NodeType为Element,Name的值为Shop,Value的值为空。XML文档中不止以上几种节点类型,XmlNodeType也包括其他节点类型,这些类型如下所示。 ​ Attribut:XML元素的属性。 ​ CDATA:用于转义文本块,避免将文本块识别为标记。 ​ Comment:XML文档的注释。 ​ Document:作为文档树的根的文档对象,可供每个XML文档进行访问。 ​ DocumentType:XML文档类型的声明。 ​ Element:XML元素。 ​ EndElement:当XmlTextReader达到元素末尾时返回。 ​ Entity:实体声明。 ​ Text:元素的文本内容。 ​ WhiteSpace:标记间的空白。 ​ XmlDeclaration:XML节点声明,它是文档中的第一个节点。 在XML文档中,空白标记和根节点的节点类型是不相同的,XmlTextReader类读取XML文件并遍历节点类型,根节点和空白节点遍历后结果如下所示。 Node Type is:XmlDeclaration Nameis:xml Value is:version="1.0" encoding="utf-8" Node Type is:Whitespace Nameis: Value is: 其中根节点的节点类型为XmlDeclaration,Value值为version="1.0" encoding="utf-8"。 14.2.5 XML文件编写类(XmlTextWriter) XmlTextWriter类属于System.Xml命名空间,同XmlTextReader类相同的是,XmlTextWriter类同样提供没有缓存,直向前的方式进行XML文件操作,但是与XmlTextReader类操作相反,XmlTextWriter类执行的是写操作。XmlTextWriter类的构造函数包括三种重载形式,分别为一个字符串、一个流对象和一个TextWriter对象。通过使用XmlTextWriter类可以动态的创建XML文档,示例代码如下所示。 XmlTextWriter wr = new XmlTextWriter("newXml.xml", null); //读取XML try { wr.Formatting = Formatting.Indented; //格式化输出 wr.WriteStartDocument(); //开始编写文档 wr.WriteStartElement("ShopInformation"); //编写节点 wr.WriteStartElement("Shop"); //编写节点 wr.WriteAttributeString("place", "北京"); //编写节点 wr.WriteElementString("Name", "中关村"); //编写节点 wr.WriteElementString("Phone", "123456"); //编写节点 wr.WriteElementString("Seller", "Guojing"); //编写节点 wr.WriteEndElement(); //结束节点编写 wr.WriteEndElement(); //结束节点编写 Response.Write("操作成功"); } catch { Response.Write("操作失败"); } 上述代码创建了一个XmlTextWriter对象并通过XmlTextWriter对象编写XML文档,在使用XmlTextWriter类构造函数时,可以指定编码类型,或使用默认的编码类型,若使用默认的编码类型,参数传递null即可,默认编码类型将为UTF-8,示例代码如下所示。 XmlTextWriter wr = new XmlTextWriter("newXml.xml", null); //创建写对象 使用了XmlTextWriter类创建对象后,则需要使用XmlTextWriter对象的Formatting方法指定输出的格式,示例代码如下所示。 wr.Formatting = Formatting.Indented; //格式化输出 指定了输出格式之后,则需要开始为XML文档创建节点,在创建节点前,首先需要声明XML文档,则必须输出声明,声明1.0版本的xml文档代码如下所示。 wr.WriteStartDocument(); //开始编写节点 声明文档后就可以使用WriteStartElement进行节点的创建,创建节点代码如下所示。 wr.WriteStartElement("Shop"); //开始编写节点 上述代码创建了Shop节点,如果需要为该节点创建place=“北京”属性则需要使用WriteAttributeString方法进行创建,示例代码如下所示。 wr.WriteAttributeString("place", "北京"); //编写属性 创建了父节点之后,可以通过WriteElementString方法创建子节点,示例代码如下所示。 wr.WriteElementString("Name", "中关村"); //创建子节点 节点全部创建完成后,需要使用WriteEndElement方法进行尾节点的编写,示例代码如下所示。 wr.WriteEndElement(); //结束节点编写 一个XML文档就编写完毕了,编写完成并不能自动的更新XML文档,还需要使用Flush方法进行数据更新,更新完毕后还需要关闭XmlTextWriter对象示例代码如下所示。 wr.Flush(); //更新文件 wr.Close(); //结束写对象 使用Flush方法就能够将XML数据保存在文件中,运行后XML文档结构如下所示。 中关村 123456 Guojing 14.2.6 XML文本文档类(XmlDocument) XML文档在内存中是以DOM为表现形式的,DOM(Document Object Model)是对象化模型,DOM是以树的节点形式来标识XML数据,14.2.2中的XML文档读入DOM结构中,则在内存中的构造图如图14-5所示。 图14-5 XML文档构造 XmlDocument类同样也属于命名空间System.Xml,XmlDocument类可以实现第一、第二级的W3C DOM。它使用DOM以一个层次结构树的形式将整个XML数据加载到内存中,从而能够使开发人员能够对内存中的任意节点进行访问、插入、更新和删除。由于XmlDocument类,简化开发人员对XML文档进行访问、插入和删除等操作。 XmlDocument类继承自System.Xml.XmlNode,该抽象类表示单个节点并具有基本的属性和方法来操作节点。利用XmlDocument对象的DocumentElement属性能够表示单个节点并进行操作。XmlDocument对象的DocumentElement返回一个指向文档元素的索引,可以通过读取给定的节点的HanChildNodes属性判断是否包括子节点。另外,使用XmlDocument对象的HasChildNodes和ChildNodes属性可以读取和遍历XML文件,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) { XmlDocument doc = new XmlDocument(); //创建XmlDocument对象 doc.Load(Server.MapPath("newXml.xml")); //载入文件 Response.Write("读取中..
"); XmlNode node = doc.DocumentElement; //读取节点 output(node); //使用输出函数 Response.Write("读取完毕..
"); //输出HTML字串 } protected void output(XmlNode node) { if (node != null) //如果节点不等于空 { format(node); //格式化输出 } if (node.HasChildNodes) //判断是否包括子节点 { node = node.FirstChild; //获取子节点 while (node != null) { output(node); //使用递归 node = node.NextSibling; //遍历节点值和信息 } } } protected void format(XmlNode node) { if (!node.HasChildNodes) //判断是否包括子节点 { Response.Write("node name is" + node.Name); //输出节点 Response.Write("node value is" + node.Value); //输出节点 Response.Write("
"); } else { Response.Write(node.Name); if (XmlNodeType.Element == node.NodeType) //遍历节点 { XmlNamedNodeMap map = node.Attributes; //遍历节点 foreach (XmlNode att in map) { Response.Write("attrnode name is" + att.Name); //格式化输出节点 Response.Write("attrnode value is" + att.Value); //格式化输出节点 Response.Write("
"); } } } } 上述代码通过使用XmlDocument类遍历节点,使用XmlDocument类遍历节点,首先需要创建一个XmlDocument对象,并使用Load方法加载一个XML文档,示例代码如下所示。 XmlDocument doc = new XmlDocument(); //创建XmlDocument对象 doc.Load(Server.MapPath("newXml.xml")); //载入XML文件 创建对象之后,则需要使用递归的方法遍历显示每个节点。在遍历节点的过程中,需要对每个节点进行是否有子节点的判断,如果包括子节点,则先输出子节点,如果没有子节点则继续输出根节点。XmlDocument对象也可以向XML文档中添加一个新的元素,示例代码如下所示。 XmlDocument doc = new XmlDocument(); //创建XmlDocument对象 doc.Load(Server.MapPath("newXml.xml")); //载入XML文件 XmlNode node = doc.DocumentElement; //创建节点对象 node.RemoveChild(node.FirstChild); //移除根节点 上述代码使用了XmlDocument对象的Load方法载入XML文档,当需要插入XML数据时,则先需要移除根节点,移除根节点之后就能够开始添加节点,示例代码如下所示。 XmlNode Shop = doc.CreateElement("Shop"); //创建节点Shop XmlNode shop1 = doc.CreateElement("Name"); //创建节点Name XmlNode shop2 = doc.CreateElement("Phone"); //创建节点Phone XmlNode shop3 = doc.CreateElement("Seller"); //创建节点Seller XmlNode NameText = doc.CreateTextNode("NameText"); //创建节点文本 XmlNode PhoneText = doc.CreateTextNode("PhoneText"); //创建节点文本 XmlNode SellerText = doc.CreateTextNode("SellerText"); //创建节点文本 shop1.AppendChild(NameText); //添加文本 shop2.AppendChild(PhoneText); //添加文本 shop3.AppendChild(SellerText); //添加文本 Shop.AppendChild(shop1); //添加Shop子节点 Shop.AppendChild(shop2); //添加Shop子节点 Shop.AppendChild(shop3); //添加Shop子节点 node.AppendChild(Shop); //添加Shop节点 上述代码分别为节点添加子节点,并为子节点添加文本,添加完成后,需要使用XmlDocument对象的Save方法进行保存,示例代码如下所示。 doc.Save("newXml.xml"); 使用XmlDocument对象的Save方法即可将XML内容保存在XML文档中。使用XmlDocument对象不仅能够读取,新增XML文档,还支持修改、删除等操作,例如使用PrependChild和InsertBefore,InsertAfter等方法进行新增和删除节点和子节点操作。 14.3 XML串行化 使用XML串行化能够方便XML的存储或传输,能够把一个对象的公共域和属性保存为一种串行格式的过程,反串行化则是使用串行的状态信息将对象从串行XML状态还原为初始状态的过程。.NET Framework提供了命名空间来简化开发人员进行XML串行化。 14.3.1 XmlSerializer串行化类 .NET Framework提供了System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能。而System.Xml.Serialization提供了一个XmlSerializer类,该类可以将一个对象串行和反串行化为XML格式。XmlSerializer类虽然能够执行串行化和反串行化,但是串行化和反串行化有一个最大的区别,就是串行化调用Serialize方法,而反串行化调用Deserialize方法。 如果需要将一个对象进行XML串行化,可以在类前添加[Serializable()]标识,声明一个定制串行化属性,如果需要将整个类都能够支持串行化,则必须添加该属性。XML串行化还包括以下属性: ​ [XmlRoot]:用来识别作为XML文件根元素的类或结构,可以用此标记把一个元素的名称设置为根元素。 ​ [XmlElement]:共有的属性或字段可以作为一个元素被串行化到XML结构中。 ​ [XmlAttribute]:共有的属性或字段可以作为一个属性被串行化到XML结构中。 ​ [XmlIgnore]:共有的属性或字段不包括在串行化的XML结构中。 ​ [XmlArray]:共有的属性或字段可以作为一个元素数组被串行到XML结构中。 ​ [XmlArrayItem]:用来识别可以放到一个串行化数组中的类型。 14.3.2 基本串行化 基本串行化是指让.NET Framework自动的对对象进行串行化操作。使用基本串行化进行操作,只要求对象拥有类属性[Serializable()]即可。如果类中的某些属性或字段不需要进行串行化操作,则使用[NonSerializable()]属性即可,示例代码如下所示。 using System.Xml.Serialization; namespace Ser { [Serializable()] //设置串行化属性 class MySer { private string Shop { get; set; } //设置Shop属性 private string Name { get; set; } //设置Name属性 private string Phone { get; set; } //设置Phone属性 private string Seller { get; set; } //设置Seller属性 [NonSerialized()] //设置非串行化 private string Age { get; set; } //设置Age属性 } } 上述代码使用了[Serializable()]属性声明一个类,则该类的成员都能够被串行化,而Age属性使用了[NonSerializable()]属性声明了该属性不应被串行化。使用[NonSerializable()]能够精确的控制串行化。若需要将类进行XML串行,则可以通过使用[XmlAttribute]等属性进行XML串行化操作,示例代码如下所示。 using System.Xml.Serialization; namespace Ser { [Serializable()] //设置串行化 [XmlRoot("SerXML")] class MySer { [XmlElement("Shop")] //设置节点属性 private string Shop { get; set; } //设置Shop属性 [XmlElement("Name")] //设置节点属性 private string Name { get; set; } //设置Name属性 [XmlElement("Phone")] //设置节点属性 private string Phone { get; set; } //设置Phone属性 [XmlElement("Seller")] //设置节点属性 private string Seller { get; set; } //设置Seller属性 [NonSerialized()] //设置非串行化 [XmlElement("Age")] //设置节点属性 private string Age { get; set; } //设置Age属性 } } 上述代码运行后的结果形式呈现为XML格式,其格式如下所示。 this.Shop this.Name this.Phone this.Seller // 在串行化结果输出时,并没有输出Age标签,是因为在Age属性前定义了[NonSerializable()]以控制该字段不会被串行化输出。 14.4 XML样式表XSL XSL是XML的样式表语言,这种定义很像HTML中的CSS。XSL转换就是XSLT,XSLT是XSL标准中的重要组成部分,它可以把一个XML文档的数据以不同结构或格式转换为另一个文档,通过使用XSL能够将XML进行格式化输出。 14.4.1 XSL简介 与HTML样式相比,XML样式要更加复杂,HTML中标记的含义都是固定的,而XML允许开发人员能够自行创建标签,所以用样式控制XML会比在HTML控制更加复杂。 1.XSL与HTML HTML样式控制通常是使用CSS层叠样式表进行控制,而XML中的样式控制通常使用XSL文档进行控制,HTML中的CSS和XML中的XSL有以下特征: ​ CSS:用于HTML样式控制,由于HTML标签事先是规定好的,所以浏览器知道如何显示HTML样式,如在HTML文档中,
标签能够以表格的形式呈现在客户端浏览器。 ​ XSL:用于XML样式控制,由于XML的标签不是事先规定好的,所以XML文档中的标记并不能被浏览器理解,如XML文档中的
并不会被浏览器解释成表格。 相比于CSS而言,XSL能够作为XML文件的样式表而存在,而XSL又不仅仅需要提供样式控制,还需要提供XML文档的方法等,XSL包括3部分,这3部分分别为: ​ 转换XML文档的方法。 ​ 定义XML部分和模式的方法。 ​ 格式化XML文档的方法。 2.XSLT XSLT翻译为可扩展样式语言转换,XSL包含三种语言,其中最重要的是XSLT。XSL转换实际上就是XSLT,在Visual Studio 2008中,可以直接创建XSLT文件对XML文件进行样式控制,定义部分和模板方法。 XSLT可以将一个XML文档的数据以不同的结构或格式转换为另一个文档格式,如HTML。为了让XML文件能够格式化输出到浏览器并能够进行样式控制,XSLT能够对XML进行样式控制,通过编写模板,以及简易的编程控制就能够读取XML中节点的数据并重新组织,当用户访问XML文件时,能够同HTML一样被浏览器解释并呈现到客户端浏览器。 3.XSLT与XSL XSLT是XSL中最重要的语言,也是XSL中最重要的组成部分,简而言之,XSL通过XSLT将一个XML源中的数据重新组织并呈现成另一种XML样式。 14.4.2 使用XSLT 使用XSL对XML进行样式控制和格式化XML文档,首先需要创建一个XML文档,这里XML文档代码如下所示。 上海电脑 123456789 J.Dan Bill Gates 广埠屯 123456789 Bill Gates 创建完成XML文档后则需要创建XSL文档,如图14-6所示。 图14-6 创建XSLT文件 创建XSLT文件后,系统会自动生成代码,示例代码如下所示。 上述代码将XSLT文件的输出方法设置为XML,为了能够方便对XML页面进行样式控制,可以将输出方法设置为HTML,XSLT文件示例代码如下所示。 一个XSLT样例
一个XSLT样例
上述代码使用了XSLT文件对XML文件进行样式控制,首先需要声明XSLT文件,因为XSLT文件同样是基于XML的,所以在文件头部必须进行声明,示例代码如下所示。 同样XSLT也需要进行声明,示例代码如下所示。 声明XSLT文件后,则可以编写XSLT文件的输出属性,创建时默认为XML,如果需要通过XSLT文件进行XML样式控制,则需要更改为HTML,示例代码如下所示。 编写XSLT文件的输出属性后,就可以编写XSL的模板,模板可以自定义标签也可以使用HTML标签。在编写模板时,需要指定模板规则的作用点,通过配置match属性可以配置模板规则的作用点,示例代码如下所示。 从XML文件可以看出,根节点为Root,根节点Root下有一个ShopInformation节点,为了显示Shop节点的数据,则需要在模板规则的作用点的match属性设置路径。模板中,在需要呈现XML文档中相应节点的值可以使用元素进行呈现,元素将拷贝XML文档中相应的节点的值到该元素,并替换后呈现给浏览器,示例代码如下所示。 上述代码首先会通过模板路径找到相应节点,在这里使用select属性声明所要找到的节点名称,如,找到Shop节点后会将Shop节点的值替换,呈现给浏览器。在XML文档中,需要声明外部XSLT文件才能在访问XML页面时正确的解释标签,示例代码如下所示。 直接在浏览器中浏览XSLT文件,则可以看到XSLT的结构树,如图14-7所示。XSLT文件制作了XML页面呈现时所需要的样式,从另一个角度来说,当用户在XML页面中定义了标签后,浏览器并不能解释这个标签,而可以通过XSLT文件告知浏览器如何解释自定义标签并呈现到页面,XML文件在浏览器中运行结果如图14-8所示。 图14-7 XSLT结构树 图14-8 XML文件格式化输出 注意:IE 5.0以下版本的浏览器很可能无法浏览结构树,如果需要在浏览器中直接浏览XSLT文件或XML文件,需要IE 5.0以上版本。 14.5 Web服务(Web Service) Web Service是Web服务器上的一些组件,客户端应用程序可通过Web发出HTTP请求来调用这些服务。通过ASP.NET开发人员可以创建自定义的Web Service或使用内置的应用程序服务,并从任何客户端应用程序调用这些服务。 14.5.1 什么是Web服务 Web服务(Web Service)可以被看作是服务器上的一个应用单元,它通过标准的XML数据格式和通用的Web 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 为其他应用程序提供信息。Web Service为其他应用程序提供接口从而能够实现特定的任务,其他应用程序可以使用Web Service提供的接口实现信息交换。 Web Service的设计是为了解决不同平台,不同语言的技术层的差异,使用Web Service无论使用何种平台,何种语言都能够使用Web Service提供的接口,各种不同平台的应用程序也可以通过Web Service进行信息交互。 例如,当Web应用程序需要制作登录操作时,可以在Web页面进行登录操作设计,当Web应用逐渐壮大,当Web应用的某些应用可以发布到用户的操作系统时,就可以编写相应的应用程序来进行操作,如使用QQ类型的软件进行网站登录。但是这样做无疑产生了安全隐患,如果将服务器的用户名和地址等代码发布到本地,这样一些非法人员很可能能够通过反编译获取软件的信息,从而进行用户信息的盗取,而使用Web Service,本地应用程序可以调用Web应用中相应的方法来实现本地登录功能,而这些方法是存在于Web Service中。Web Service还具有以下特性: ​ 实现了松耦合:应用程序与Web Service执行交互前,应用程序与Web Service之间的连接是断开的,当应用程序需要调用Web Service的方法时,应用程序与Web Service之间建立了连接,当应用程序实现了相应的功能后,应用程序与Web Service之间的连接断开。应用程序与Web应用之间的连接是动态建立的,实现了系统的松耦合。 ​ 跨平台性:Web Service是基于XML格式并切基于通用的Web协议而存在的,对于不同的平台,只要能够支持编写和解释XML格式文件就能够实现不同平台之间应用程序的相互通信。 ​ 语言无关性:无论是用何种语言实现Web Service,因为Web Service基于XML格式,只要该语言最后对于对象的表现形式和描述是基于XML的,不同的语言之间也可以共享信息。 ​ 描述性:Web Service使用WSDL作为自身的描述语言,WSDL具有解释服务的功能,WSDL还能够帮助其他应用程序访问Web Service。 ​ 可发现性:应用程序可以通过Web Service提供的注册中心查找和定位所需的Web Service。 Web Service也是使用和制作分布式所需的条件,使用Web Service能够让不同的应用程序之间进行交互操作,这样极大的简化了开发人员的平台的移植难度。 14.5.2 Web服务体系结构 要讲到Web Service体系结构就不得不提到SOA,SOA(Serveice-Oriented Architecture,面向服务的体系结构)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。 在SOA中,接口采用中立的方式定义,接口只声明开发人员如何继承和实现该接口,接口的声明应该是中立的、不依赖于平台、语言而实现的。接口相当于如何规定开发人员规范的进行Web Service中功能的实现。SOA具有以下特点。 ​ SOA服务具有平台独立的自我描述XML文档。Web服务描述语言(WSDL, Web Services Description Language)是用于描述服务的标准语言。 ​ SOA 服务用消息进行通信,该消息通常使用XML Schema来定义(也叫做XSD, XML Schema Definition)。 Web Service体系结构则采用了SOA模型,Web Service模型包含三个角色,这三个角色包括服务提供者、服务请求者和服务注册中心,如图14-9所示。 图14-9 Web Service体系结构 其中,服务提供者也可以称为服务的拥有者,它通过提供服务接口使Web Service在网络上是可用的。服务接口是可以被其他应用程序访问和使用的软件组件,如果服务提供者创建了服务接口,服务提供者会向服务注册中心发布服务,以注册服务描述。相对于Web Service而言,服务提供者可以看作访问服务的托管平台。 服务请求者也称为Web Service的使用者,服务请求者可以通过服务注册中心查找服务提供者,当请求者通过服务器中心查找到提供者之后,就会绑定到服务接口上,与服务提供者进行通信。相对于Web Service而言,服务请求者是寻找和调用提供者提供的接口的应用程序。 服务注册中心提供请求者和提供者进行信息通信,当服务提供者提供服务接口后,服务注册中心则会接受提供者发出的请求,从而注册提供者。而服务请求者对注册中心进行服务请求后,注册中心能够查找到提供者并绑定到请求者。 14.5.3 Web服务协议栈 在Web Service体系结构中,为了保证体系结构中的每个角色都能够正确和执行Web Service体系结构中的发布、查找和绑定操作,Web Service体系必须为每一层标准技术提供Web Service协议栈。Web Service协议栈如图14-10所示。 图14-10 Web Service协议栈示意图 在Web Service协议栈中,最为底层的是网络传输层,Web服务协议是Web Service协议栈的基础。用户需要通过Web服务协议来调用服务接口。网络传输层可以使用多种协议,包括HTTP、FTP以及SMTP。 在网络传输层上一层的则是消息传递层,消息传递层使用SOAP作为消息传递协议,以实现服务提供者,服务注册中心和服务请求者之间进行信息交换。 在消息传底层之上的是服务描述层,服务描述层使用WSDL作为消息协议,WSDL使用XML语言来描述网络服务,在前面的章节中也讲到,WSDL具有自我描述性,它能够提供Web服务的一些特定信息。服务描述层包括了WSDL文档,这些文档包括功能、接口、结构等定义和描述。 在服务描述层之上的是服务发布层,该层使用UDDI协议作为服务的发布/集成协议。UDDI提供了Web服务的注册库,用于存储Web服务的描述信息。服务发布层能够为提供者提供发布Web服务的功能,也能够为服务请求者提供查询,绑定的功能。 当Web Service中触发了事件,如服务提供者发布服务接口、服务请求者请求服务等,服务提供者首先使用WSDL描述自己的服务接口,通过使用UDDI在服务器发布层向服务注册中心发布服务接口。服务注册中心则会返回WSDL文档。当服务请求者对服务注册中心执行服务请求,请求着通过WSDL文档的描述绑定相应的服务接口。 14.6 简单Web Service示例 在了解了Web Service基本的概念和协议栈的运行过程后,可以使用Visual Studio 2008进行Web Service应用程序的创建。单击菜单栏上的【文件】选项,在下拉菜
本文档为【第14章.ASP.NET XML和Web Service】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_518229
暂无简介~
格式:doc
大小:976KB
软件:Word
页数:25
分类:互联网
上传时间:2011-04-07
浏览量:8