3. 数据集的InferXmlSchema方法根据传递给它的XML数据的结构派生出数据集架构。
InferXmlSchema与上一节介绍的ReadXmlSchema方法的输入源相同。另外,InferXMLSchema方法接受表示命名空间的字符串数组,这个空间在生成数据集架构时应被忽略。
Dim newDS As New System.Data.DataSet() Dim nsStr()As string newDS.InferXmlSchema("dataOnly.xml",nsStr)) Me.daCategories.Fill(newDS.Tables("Categories")) Me.daProducts.Fill(newDS.Tables(Products")) newDS.Relations.Add("CategoriesProducts", _ newDS.Tables("Categories").Columns("CategoryID"), _ newDS.Tables("Products").Columns("CategoryID")) |
前两行代码声明了数据集和String数组变量,第3行将结果传递到InferXmlSchema方法中。接下来的代码给新数据集添加并填充了新的数据关系,然后SetBindings函数将XML窗体控件绑定到数据集上。
4.WriteXmlSchema方法将数据集架构(包括表、列和约束)写到指定输出中。这个方法和其他XML方法一样,都接受相同的输出参数。
Me.dsMaster1.WriteXmlSchema("testSchema.xsd") Messagebox.Show("Finished","WriteXmlSchema") |
5. 与ReadXml类似,数据集的WriteXml方法也可将XML数据或可选的数据集架构信息写到指定输出中。
Me.daCategories.Fill(Me.dsMaster1.Categories) Me.daProducts.Fill(Me.dsMaster1.Products) Me.dsMaster1.WriteXml("newData.xml", XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished", “WriteXml") |
默认情况下,WriteXml方法生成XML,所生成的XML是一般结构来设置格式的,其中数据表的结构作为复杂类型,数据列的结构作为复杂类型中的元素。这并不一定是所需要的输出结果。例如,如果要将数据读回到数据集,只有存在架构时(而架构在很多情况下都是不很必要的开销)或者相关数据嵌套在XML层次结构中时,ADO.NET才会创建正确的关系。在其他情况下,也许需要控制列是否以元素、必性或简单文本方式写入,或者完全阻止某些列被写入。比如,在应用程序间互换数据就可能出会这种情况。
Me.daCategories.Fill(Me.dsMaster1.Categories) Me.daProducts.Fill(Me.dsMaster1.Products) Me.dsMaster1.Relations("CategoriesProducts").Nested = True Me.dsMaster1.WriteXml("nestedData.xml",XmlWriteMode.IgnoreSchema) MessageBox.Show("Finished","WriteXml Nested") |
数据列的ColumnMapping(列映射)属性控制着WriteXML方法写入列的方式。ColumnMapping属性的可能取值。 默认值Element将列作为表示数据表的复杂类型内的嵌套元素写入,同时,Attribute将列作为它的必性之一写入。这两个值可以在任何给定的数据表内混用。Hidden值可防止列写入。SimpleContent将列作为一个简单文本值写入,它不能与那些作为元素或属性写入的列混合,也不能在数据关系的Nested属性引用一个将Nested属性设置为True的表时使用。
Me.daCategories.Fill(Me.dsMaster1.Categories) with Me.dsMaster1.Categories .Columns("CategoryID").ColumnMapping = MappingType.Attribute .Columns("CategoryName").ColumnMapping = MappingType.Attribute .Columns("dESCRIPTION").ColumnMapping = MappingType.Attribute End with Me.dsMaster1.WriteXml("attributes.xml", XmlWriteMode.IgnoreSchme) MessageBox.Show("Finished", "Write Attributes") |
6. 虽然关系数据有效,但有些时候使用XML提供的工具(如XSL(可扩展样式表语言)、XSLT、和XPath)操作一组数据会更方便。
.NET框架的Xml数据文档(XML DataDocument)使之成为可能。Xml数据文档允许将XML结构的数据作为数据集来操作。它不会创建一组新数据,但会创建一个引用所有或部分XML数据的数据集。因为只有一组数据,在一个视图中所作的更改将会自动反映在另一个视图中。当然存储资源会被保存,因为只维护了数据的一个副本。
根据数据的初始源的不同,可以基于数据集的架构和内容创建一个Xml数据文档,或基于Xml数据文档的内容创建数据集。在任何一种情况下,对一个视图中存数据所作的更改将会映射到另一个视图中。
要创建基于现有数据集的Xml数据文档,可将数据集传递给XMLDataDocument构造函数:
myXDD = New XmlDataDocument(myDS) |
如果在创建Xml数据文档之前,数据集架构还未建立,那就必须手动建立这两个架构,因为对一个对象所作的架构更改不会被传播给另一个对象。反之,若要从XML文档开始并创建数据集,可以使用默认的XMLDataDocument构造函数,然后引用其数据集属性。
myXdd = New XmlDataDocument() myDS = myXDD.DataSet |
如果使用这个方法,就必须通过将对象添加到数据集的表数据表的列集合来手动创建数据集架构。为了能通过数据集使用Xml数据文档的数据,数据表和数据列的名称必须与Xml数据文档中的名称相匹配,名称匹区分大小写的。
第二种方法需要的代码稍微多一些,提供了一个创建XML数据部分关系视图的机制。在数据集中复制整个XML架构没有特殊要求。在数据集操作期间,所有不在数据集中的数据表和数据列都会被忽略。
任何时候,同步前或同步后,都可将数据加载入两个文档中。对一个对象所作的数据更改(包括添加、删除或更改值)都会被自动映射到另一对象中。
Dim mySDD As System.Xml.XmlDataDocument myXDD = New System.Xml.XmlDataDocument(Me.dsMaster1) myXDD.Load ("dataOnly.xml") SetBindings(Me.dsMaster1) |
.NET框架对XML操作提供广泛支持,在System.XML名字空间中可以找到超过150个类,限于本人水平有限,只研究了XML和ADO.NET数据集之间的接口。
总之,无论你喜欢与否,.NET框架都有一个令人难以拒绝的地方:这是个崭新的平台。在学习的过程中都要投如较多的精力。从现在开始,我们都是初学者,所以,请大家多多指点。
查看本文来源