同步的 DataSet 和 XmlDataDocument 之间存在的关系为您提供了访问 XmlDataDocument 的 XML 服务(如 XML 路径语言 (XPath) 查询),这些服务可以比直接访问 DataSet 更为方便地执行某些功能。例如,不必使用 DataTable 的 Select 方法将关系导航到 DataSet 中的其他表,而可以对与 DataSet 同步的 XmlDataDocument 执行 XPath 查询,从而以 XmlNodeList 形式获取 XML 元素的列表。XmlNodeList 中的节点将转换为 XmlElement 节点,然后可以传递到 XmlDataDocument 的 GetRowFromElement 方法,以返回对同步 DataSet 中表行的匹配 DataRow 引用。
例如,以下代码示例执行“孙子”XPath 查询。该 DataSet 中填充了三个表:Customers、Orders 和 OrderDetails。在该示例中,将首先在 Customers 和 Orders 表之间以及 Orders 表和 OrderDetails 表之间创建父子关系。然后,执行 XPath 查询来返回特定 Customers 节点的 XmlNodeList,在这些 Customers 节点中,孙子 OrderDetails 节点包含值为 43 的 ProductID 节点。实质上,该示例是在使用 XPath 查询来确定哪些客户订购了 ProductID 为 43 的产品。
[C#]
using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
public class Sample
{
public static void Main()
{
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI;");
nwindConn.Open();
DataSet myDataSet = new DataSet("CustomerOrders");
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
custDA.Fill(myDataSet, "Customers");
SqlDataAdapter ordersDA = new SqlDataAdapter("SELECT * FROM Orders", nwindConn);
ordersDA.Fill(myDataSet, "Orders");
SqlDataAdapter detailsDA = new SqlDataAdapter("SELECT * FROM [Order Details]", nwindConn);
detailsDA.Fill(myDataSet, "OrderDetails");
nwindConn.Close();
myDataSet.Relations.Add("CustOrders",
myDataSet.Tables["Customers"].Columns["CustomerID"],
myDataSet.Tables["Orders"].Columns["CustomerID"]).Nested = true;
myDataSet.Relations.Add("OrderDetail",
myDataSet.Tables["Orders"].Columns["OrderID"],
myDataSet.Tables["OrderDetails"].Columns["OrderID"], false).Nested = true;
XmlDataDocument xmlDoc = new XmlDataDocument(myDataSet);
XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("descendant::Customers[*/OrderDetails/ProductID=43]");
DataRow myRow;
foreach (XmlNode myNode in nodeList)
{
myRow = xmlDoc.GetRowFromElement((XmlElement)myNode);
if (myRow != null)
Console.WriteLine(myRow[0]);
}
}
}