ADO.NET 通过非连接的 DataSet 和 DataTable 支持 XML。这两个对象都能通过内建的智能把行的集合转换成 XML 文档。
DataSet 的所有 XML 方法:
GetXml() | 得到以 XML 格式表现的 DataSet 中的数据并将其作为单个字符串 |
WriteXml() | 把 DataSet 的内容写入文件或 TextWriter、XmlWriter、Stream 对象 |
ReadXml() | 从文件或 TextWriter、XmlWriter、Stream 对象读取 XML ,并填充 DataSet |
GetXmlSchema() | 以字符串形式得到 XML 架构,不返回数据 |
WriteXmlSchema() | 只把描述 DataSet 结构的 XML 架构写入文件或 TextWriter、XmlWriter、Stream 对象 |
ReadXmlSchema() | 从文件或 TextWriter、XmlWriter、Stream 对象读取 XML 架构,并配置 DataSet 的结构 |
InferXmlSchema() | 从文件或 TextWriter、XmlWriter、Stream 对象读取 DataSet 内容的 XML 文档,并用它推断 DataSet 应有的结构。可以替换ReadXmlSchema(),但并不保证保存所有的数据类型的信息 |
把 DataSet 转换为 XML
创建 DataSet 后,就可以用它生成一个描述 DataSet 结构的 XML 架构文件以及一个包含每行内容的 XML 文件。下面的代码可以把 DataSet 保存到一个 XML 文件里:
string conStr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection conn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("select EmployeeID,TitleOfCourtesy,FirstName,LastName from employees", conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable("Employees");
sda.Fill(dt);
string xmlFile = Server.MapPath("Employees.xml");
dt.WriteXml(xmlFile, XmlWriteMode.WriteSchema);
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Employees" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Employees">
<xs:complexType>
<xs:sequence>
<xs:element name="EmployeeID" type="xs:int" minOccurs="0" />
<xs:element name="TitleOfCourtesy" type="xs:string" minOccurs="0" />
<xs:element name="FirstName" type="xs:string" minOccurs="0" />
<xs:element name="LastName" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Employees>
<EmployeeID>1</EmployeeID>
<TitleOfCourtesy>Ms.</TitleOfCourtesy>
<FirstName>Nancy</FirstName>
<LastName>Davolio</LastName>
</Employees>
<Employees>
<EmployeeID>2</EmployeeID>
<TitleOfCourtesy>Dr.</TitleOfCourtesy>
<FirstName>Andrew</FirstName>
<LastName>Fuller</LastName>
</Employees>
<Employees>
<EmployeeID>3</EmployeeID>
<TitleOfCourtesy>Ms.</TitleOfCourtesy>
<FirstName>Janet333</FirstName>
<LastName>Leverling</LastName>
</Employees>
<Employees>
<EmployeeID>4</EmployeeID>
<TitleOfCourtesy>Mrs.</TitleOfCourtesy>
<FirstName>Margaret</FirstName>
<LastName>Peacock</LastName>
</Employees>
<Employees>
<EmployeeID>5</EmployeeID>
<TitleOfCourtesy>Mr.</TitleOfCourtesy>
<FirstName>Steven</FirstName>
<LastName>Buchanan</LastName>
</Employees>
<Employees>
<EmployeeID>6</EmployeeID>
<TitleOfCourtesy>Mr.</TitleOfCourtesy>
<FirstName>Michael</FirstName>
<LastName>Suyama</LastName>
</Employees>
<Employees>
<EmployeeID>7</EmployeeID>
<TitleOfCourtesy>Mr.</TitleOfCourtesy>
<FirstName>Robert</FirstName>
<LastName>King</LastName>
</Employees>
<Employees>
<EmployeeID>8</EmployeeID>
<TitleOfCourtesy>Ms.</TitleOfCourtesy>
<FirstName>Laura</FirstName>
<LastName>Callahan</LastName>
</Employees>
<Employees>
<EmployeeID>9</EmployeeID>
<TitleOfCourtesy>Ms.</TitleOfCourtesy>
<FirstName>Anne</FirstName>
<LastName>Dodsworth</LastName>
</Employees>
</NewDataSet>
当然,还可以执行一个逆向的操作:
string xmlFile = Server.MapPath("Employees.xml");
dt.ReadXml(xmlFile);
DataSet XML 按几个简单的规则来预定义格式:
- 文档根元素是 DataSet.DataSetName (例如 Northwind)
- 每个表的每一行按表的名称包含在独立的元素里 (例如 Employees)
- 行中的每个字段包含在行的标签里,字段值保存为标签中的文本
注意:
DataSet 不允许你改变整体结构。如果要把 DataSet 转换成其他格式的 XML,必须用 XSLT 手工操作或者把它加载到一个 XmlDocument 对象里。
把 DataSet 作为 XML 访问
DataSet 的另一个可选功能是通过 XML 接口来访问它。这样你就可以对从数据库获得的数据执行 XML 特定的操作(比如查找标签或者使用 XSL 转换)。
要这样处理 DataSet ,首先要获得一个封装了 DataSet 的 XmlDataDocument:
XmlDataDocument dataDocument = new XmlDataDocument(myDataSet);
现在,就可以用两种眼光看待 DataSet 了。因为 XmlDataDocument 继承自 XmlDocument 类,它提供了用于检查节点和修改内容的相同的属性和方法。你可以用基于 XML 的方式处理数据,或者通过 XmlDataDocument.DataSet 属性操作 DataSet 。在任何情况下,这两个视图都保持同步(但这个同步也增加了额外的负载,结果就是 XmlDataDocument 不是管理 XML 文档的最有效的办法,XmlDocument 和 XDocument 类要更快)。
示例代码:
protected void Page_Load(object sender, EventArgs e)
{
string conStr = System.Web.Configuration
.WebConfigurationManager.ConnectionStrings["Pubs"].ConnectionString;
SqlConnection conn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("select * from authors where city='Oakland'", conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet("AuthorsDataSet");
sda.Fill(ds, "AuthorsTable");
XmlDataDocument dataDoc = new XmlDataDocument(ds);
Xml1.XPathNavigator = dataDoc.CreateNavigator();
Xml1.TransformSource = "authors.xsl";
}
下面这个 XSL 文件把 XML 数据转换成一个可以直接显示的 HTML:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="AuthorsDataSet">
<h1>The Author List</h1>
<xsl:apply-templates select="AuthorsTable"></xsl:apply-templates>
</xsl:template>
<xsl:template match="AuthorsTable">
<p>
<b>Name:</b>
<xsl:value-of select="au_lname"/>,<xsl:value-of select="au_fname"/><br />
<b>Phone:</b><xsl:value-of select="phone"/>
</p>
</xsl:template>
</xsl:stylesheet>
按 XML 处理数据时,所有数据库的概念如关系,唯一约束等都不再生效。把 DataSet 作为 XML 处理的唯一理由是你需要执行 XML 特定的任务。多数情况下使用 GridView 之类的高级控件把数据转换成 HTML 显示,比创建专门的 XSL 样式表简单的多。
总结:
XML 是一个很大的议题,还有许多未涉及的部分,如高级导航、搜索和选择技术、验证以及序列化。不过要记住,只在必需的时候才使用 XML 。对于以可读格式持久化基于文件的数据以及与其他应用组件和服务共享信息时,XML 是一个非常好的工具。但是,它不能代替你之前所看到的核心数据管理技术。