230 likes | 379 Views
项目九 在 .NET 中处理 XML. 回顾. 跟踪是 ASP.NET 引入的新功能,只需对页面和应用程序启用此功能,就可以查看有关单个 ASP.NET 页请求的诊断信息 页面级跟踪具有一个称为 TraceMode 的属性,此属性接受 SortByCategory 或 SortByTime 属性值,以决定如何显示输出结果 应用程序级跟踪将启动对整个应用程序的跟踪。需要在 web.config 配置文件中进行设置 缓存是一项在计算中广泛用来提高性能的技术,它将访问频率高的数据或构造成本高的数据保留在内存中 输出缓存将缓存整个页面,数据缓存将设置内存变量缓存
E N D
回顾 • 跟踪是ASP.NET 引入的新功能,只需对页面和应用程序启用此功能,就可以查看有关单个ASP.NET 页请求的诊断信息 • 页面级跟踪具有一个称为 TraceMode 的属性,此属性接受 SortByCategory 或 SortByTime 属性值,以决定如何显示输出结果 • 应用程序级跟踪将启动对整个应用程序的跟踪。需要在web.config配置文件中进行设置 • 缓存是一项在计算中广泛用来提高性能的技术,它将访问频率高的数据或构造成本高的数据保留在内存中 • 输出缓存将缓存整个页面,数据缓存将设置内存变量缓存 • 使用 VS.NET的“Web安装项目”可以将应用程序打包成易于部署的形式
目标 • 理解XMLDocument 结构 • 使用 XML 命名空间中的 XMLDocument 对象 • 使用 XMLReader 和 XMLWriter 对象 • 使用 XMLValidatingReader • 填充XML 文件中的数据集 • 使用数据集创建 XML 文档
XML 文档结构 元数据是定义用于定义其他特定于域的语义和结构化标记语言的语法用途 基于文本的数据标准 用于定义语义标签的规则集合 将文档分解为多个部分 标准 XML 标识文档各部分 通信
组织 XML 数据 标识使用的版本 <?xml version="1.0" ?> 演示根元素的示例代码 Phonebook元素具有开始标签 <phonebook> 和结束标签</phonebook> <?xml version="1.0" ?> <Phonebook> ... </Phonebook> <?xml version="1.0" ?> <Phonebook> <Year>1998</Year> </Phonebook> 具有子元素 <Year>的 Phonebook 元素
System.Xml命名空间 • System.Xml命名空间包含了处理Xml的类,以下是经常用到的类 • XmlTextReader 类提供对 XML 数据的快速、非高速缓存的只进读访问 • XmlValidatingReader 类提供 DTD、XDR 和 XSD Schema 验证 • XmlTextWriter 类提供一种生成 XML 的快速只进方法 • XmlDataDocument 类提供 XmlDocument 的实现,此 XmlDocument 可以与数据集关联。可以通过数据集的关系表示或 XmlDataDocument 的树表示,来同时查看和操作结构化的 XML • XPathNavigator 类提供 W3C XPath 1.0 数据模型,而不是用于导航的光标样式模型的存储 • XslTransform 类是一个 W3C XSLT 1.0 规范兼容的 XSLT 处理器,用于转换 XML 文档 • XmlSchema 对象模型类提供一组直接反映 W3C XSD 规范的可导航类。这些类支持在程序中创建 XSD Schema
XMLDocument 对象 内存 XML文档对象模型 (XML DOM) 类 XML 文档 + 提供了对读取、写入和操作 XML 文档的支持 执行任务 (如加载和保存文档) 包括 Load()、 LoadXML() 和 Save() 用于访问文档中的所有节点 XML 文档对象
加载 XML 文档 3-1 将 XML 文档 加载到变量中 Load() 方法 如果不能解析或 访问 URL 从指定位置 加载 XML 文档 返回错误,并将文档对象的 documentElement 属性设置为 null
加载 XML 文档 3-2 <?xml version="1.0"?> <PhoneBook> <Name>加菲尔德</Name> <Number>5555555</Number> <City>纽约</City> <DateOfBirth>26/10/1978</DateOfBirth> <Name>迈克</Name> <Number>6666666</Number> <City>纽约</City> <DateOfBirth>12/02/1978</DateOfBirth> </PhoneBook> private void Page_Load(object sender , System.EventArgs e) { XmlDocument MyPhone = new XmlDocument(); MyPhone.Load( @"C:\Inetpub\wwwroot\aspex\CH12\phone.xml"); lblXmlData.Text = MyPhone.InnerXml.ToString(); }
加载 XML 文档 3-3 LoadXML() 方法 XmlDocument MyPhone = new XmlDocument(); string xmlString = "<PhoneBook>" + "<Name>加菲尔德</Name>" + "<Number>5555555</Number>" + "<City>北京纽约</City>" + "<DateOfBirth>26/10/1978</DateOfBirth>" + "<Name>迈克</Name>" + "<Number>6666666</Number>" + "<City>纽约</City>" + "<DateOfBirth>12/02/1978</DateOfBirth>" + "</PhoneBook>"; MyPhone.LoadXml( xmlString ); 使用提供的字符串加载 XML 文档 加载成功则返回 true 加载失败则返回 false,并将文档对象的 documentElement 属性设置为 null
获取节点和节点属性 节点属性 获取节点 XmlDocument MyPhone = new XmlDocument(); MyPhone.Load (Server.MapPath (“phone.xml")); //获取根元素 XmlElement root = MyPhone.DocumentElement; XmlElement phone = root.ChildNodes[0];
XmlDocument MyPhone = new XmlDocument(); MyPhone.Load(Server.MapPath("phone.xml")); XmlElement newFriendsName = MyPhone.CreateElement( "Name" ); newFriendsName.InnerText = "斯坦利"; MyPhone.DocumentElement.InsertAfter( newFriendsName , MyPhone.DocumentElement.LastChild ); XmlElement newFriendsNumber = MyPhone.CreateElement("Number"); newFriendsNumber.InnerText = "7777777"; MyPhone.DocumentElement.InsertAfter( newFriendsNumber , MyPhone.DocumentElement.LastChild ); XmlElement newFriendsCity = MyPhone.CreateElement("City"); newFriendsCity.InnerText = "加利福尼亚"; MyPhone.DocumentElement.InsertAfter( newFriendsCity , MyPhone.DocumentElement.LastChild); XmlElement newFriendsDOB = MyPhone.CreateElement( "DateOfBirth" ); newFriendsDOB.InnerText = "12/06/1984"; MyPhone.DocumentElement.InsertAfter( newFriendsDOB , MyPhone.DocumentElement.LastChild ); MyPhone.Save(Server.MapPath("phone1.xml")); Response.Write("数据已写入!单击“加载”查看 Phone.xml"); 使用 Save 方法编写 XML 数据 输出结果
从 XML 文档中读取节点 2-1 从 XML 文档中读取节点 用于确定各种因素(如节点的深度) 由用于读取基于文本的 XML 文件的 XmlTextReader 类实现 提供对 XML 数据流 的快速访问 XmlReader 另一个派生类是 XmlValidatingReader (读取 XML 数据,并支持 DTD 和 Schema 验证) 一个抽象类
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Xml; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace CH12 { public class XMLReaderDemo : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblRecords; private void Page_Load(object sender, System.EventArgs e) { string fileName = Server.MapPath (“Phone.xml “); XmlTextReader objXmlTextReader = new XmlTextReader(fileName); while(objXmlTextReader.Read()) { if (objXmlTextReader.NodeType ==XmlNodeType.Element) { if (objXmlTextReader.LocalName.Equals("Name") || objXmlTextReader.LocalName.Equals ("Number")) { lblRecords.Text += objXmlTextReader.ReadString() + "\t"; } } } } } } 从 XML 文档中读取节点 2-2
在 XML 文档中写入节点 2-1 在 XML 文档中写入节点 XMLTextWriter 类派生自该类 帮助创建 XML 流并将数据写入到格式良好的 XML 文档 一个抽象类 XmlWriter
在 XML 文档中写入节点 2-2 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Xml; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace CH12 { public class XmlWriterDemo : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { string FileName = @"C:\Inetpub\wwwroot\aspex\CH12\phone.xml"; XmlTextWriter objXmlTextWriter = new XmlTextWriter( FileName, null); objXmlTextWriter.Formatting = Formatting.Indented; objXmlTextWriter.Indentation= 6; objXmlTextWriter.WriteStartDocument(); objXmlTextWriter.WriteStartElement("", "PhoneBook", ""); objXmlTextWriter.WriteStartElement("", "Name", ""); objXmlTextWriter.WriteString(“加菲尔德"); … objXmlTextWriter.WriteEndElement(); objXmlTextWriter.WriteStartElement("", "Number", ""); objXmlTextWriter.WriteString("5555555"); objXmlTextWriter.WriteEndElement(); objXmlTextWriter.WriteStartElement("", "City", ""); objXmlTextWriter.WriteString(“纽约"); objXmlTextWriter.WriteEndElement(); objXmlTextWriter.WriteStartElement("", "DateOfBirth", ""); objXmlTextWriter.WriteString("26/10/1978"); objXmlTextWriter.WriteEndElement(); objXmlTextWriter.WriteEndElement(); objXmlTextWriter.WriteEndDocument(); objXmlTextWriter.Flush(); objXmlTextWriter.Close(); } } } … 输出结果
XML 和数据集 导入 System.IO 数据以读取 XML 数据 存储 XML 数据,而不会引发任何错误 数据集 数据集读取以下格式的数据: <DocumentElement> <TableName> <ColumnName1>列的值</ColumnName1> <ColumnName2>列的值</ColumnName2> </TableName> <TableName> <ColumnName1>列的值</ColumnName1> <ColumnName2>列的值</ColumnName2> </TableName> </DocumentElement>
使用 ReadXml 方法读取 XML 数据 2-1 如何打开 XML 文件 FileStream myfs = new FileStream(Server.MapPath ("xmldatagrid.xml"),FileMode.Open, FileAccess.Read); 打开文件之后,定义一个 StreamReader并把 FileStream传入 StreamReader myreader = new StreamReader(myfs); 数据集读取 StreamReader. ReadXml()方法中的 XML 数据 DataSet myds = new DataSet(); myds.ReadXml(myreader); 需要将 XML 数据绑定到数据集 DataView mySource = new DataView(myds.Tables[0]); dbgMyGrid.DataSource = mySource; dbgMyGrid.DataBind();
使用 ReadXml 方法读取 XML 数据 StreamReader myreader = new StreamReader(myfs); myds.ReadXml(myreader); myfs.Close(); DataView mySource = new DataView(myds.Tables[0]); blTableName.Text = lblTableName.Text +mySource.Table.TableName; dgMyGrid.DataSource = mySource; dgMyGrid.DataBind(); } } } </schema> <DocumentElement> <Headlines> <TickerInfo>.Net 开发者</TickerInfo> <TickerURL>www.microsoft.com</TickerURL> </Headlines> <Headlines> <TickerInfo>精彩站点</TickerInfo> <TickerURL>www.msn.com</TickerURL> </Headlines> <Headlines> <TickerInfo>学习 XML 与 ASP.NET</TickerInfo> <TickerURL>www.xmlforasp.net</TickerURL> </Headlines> <Headlines> <TickerInfo>Microsoft ASP.NET 官方网站</TickerInfo> <TickerURL>www.asp.net</TickerURL> </Headlines> </DocumentElement> </root> using System; using System.Collections; using System.ComponentModel; using System.IO; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace CH12 { public class ReadXml : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblTableName; protected System.Web.UI.WebControls.DataGrid dgMyGrid; private void Page_Load(object sender, System.EventArgs e) { DataSet myds = new DataSet(); FileStream myfs = new FileStream(Server.MapPath ("xmldatagrid.xml"),FileMode.Open, FileAccess.Read); <root> <schema id="DocumentElement" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xdo="urn:schemas-microsoft-com:xml-xdo" xdo:DataSetName="DocumentElement"> <element name="Headlines"> <complexType> <all> <element name="TickerInfo" type="string"></element> <element name="TickerURL" type="string"></element> </all> </complexType> </element>
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace CH12 { public class Writexml : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { DataSet ds = new DataSet("Test"); SqlConnection objSqlConnection = new SqlConnection ("server = VIJAYK; user id=sa; pwd=playware;” + “database=northwind"); SqlDataAdapter objSqlDataAdapter = new SqlDataAdapter( "select * from employees", objSqlConnection); objSqlDataAdapter.Fill(ds, "MyEmployees"); ds.WriteXml(Server.MapPath (“MyEmployees.xml")); Response.Write(“使用 northwind 数据库 employees表中的记录” + “成功创建了 XML 文件"); } } } 使用 WriteXML 方法写入 XML 数据 Dataset 对象的 WriteXml() 方法用于在目标文件夹中创建 XML 文件 示例 6 演示了将数据从 SQL Server 2000 数据库中读取到数据集中,并将其以 XML 文件的形式进行保存。
总结 • XmlDocument 类给出 XML 文档的树表示,XmlDocument类允许操作 XML 文档 • 要在文本文件中读取和写入 XML 文档,则需要使用 XmlTextReader 和 XmlTextWriter 类。XmlTextReader和XmlTextWriter类和XmlDocument类比较,因为不需要把整个Xml文档读取到内存中,所以比XmlDocument占用资源少 • XmlValidatingReader 类提供 DTD、XML 数据简化 (XDR) 以及 XML Schema 验证服务,这些服务支持验证 XML 文档或 XML 文档的一部分 • Xml和数据集可以互相转换