对数据集执行 XPath 查询
通过同步的 DataSet 与 XmlDataDocument 之间的关系,你可以使用 XML 服务(例如 XML 路径语言 (XPath) 查询)访问 XmlDataDocument,并且可以比直接访问数据集更方便地执行某些功能。 例如,不必使用 DataTable 的 Select 方法将关系导航到数据集中的其他表,而可以对与数据集同步的 XmlDataDocument 执行 XPath 查询,从而以 XmlNodeList 形式获取 XML 元素的列表。 XmlNodeList 中的节点将强制转换为 XmlElement 节点,然后可以传递到 XmlDataDocument 的 GetRowFromElement 方法,以返回对同步数据集中表行的匹配 DataRow 引用。
例如,以下代码示例执行“孙级”XPath 查询。 数据集由三个表进行填充:Customers、Orders 和 OrderDetails。 在该示例中,将首先在 Customers 表和 Orders 表之间以及 Orders 表和 OrderDetails 表之间创建父子关系。 然后,执行 XPath 查询来返回特定 Customers 节点的 XmlNodeList,在这些节点中,孙级 OrderDetails 节点的 ProductID 节点值为 43。 实质上,该示例是使用 XPath 查询来确定哪些客户订购了 ProductID 为 43 的产品。
' Assumes that connection is a valid SqlConnection.
connection.Open()
Dim dataSet As DataSet = New DataSet("CustomerOrders")
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Customers", connection)
customerAdapter.Fill(dataSet, "Customers")
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Orders", connection)
orderAdapter.Fill(dataSet, "Orders")
Dim detailAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM [Order Details]", connection)
detailAdapter.Fill(dataSet, "OrderDetails")
connection.Close()
dataSet.Relations.Add("CustOrders", _
dataSet.Tables("Customers").Columns("CustomerID"), _
dataSet.Tables("Orders").Columns("CustomerID")).Nested = true
dataSet.Relations.Add("OrderDetail", _
dataSet.Tables("Orders").Columns("OrderID"), _
dataSet.Tables("OrderDetails").Columns("OrderID"), false).Nested = true
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(dataSet)
Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes( _
"descendant::Customers[*/OrderDetails/ProductID=43]")
Dim dataRow As DataRow
Dim xmlNode As XmlNode
For Each xmlNode In nodeList
dataRow = xmlDoc.GetRowFromElement(CType(xmlNode, XmlElement))
If Not dataRow Is Nothing then Console.WriteLine(xmlRow(0).ToString())
Next
// Assumes that connection is a valid SqlConnection.
connection.Open();
DataSet dataSet = new DataSet("CustomerOrders");
SqlDataAdapter customerAdapter = new SqlDataAdapter(
"SELECT * FROM Customers", connection);
customerAdapter.Fill(dataSet, "Customers");
SqlDataAdapter orderAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", connection);
orderAdapter.Fill(dataSet, "Orders");
SqlDataAdapter detailAdapter = new SqlDataAdapter(
"SELECT * FROM [Order Details]", connection);
detailAdapter.Fill(dataSet, "OrderDetails");
connection.Close();
dataSet.Relations.Add("CustOrders",
dataSet.Tables["Customers"].Columns["CustomerID"],
dataSet.Tables["Orders"].Columns["CustomerID"]).Nested = true;
dataSet.Relations.Add("OrderDetail",
dataSet.Tables["Orders"].Columns["OrderID"],
dataSet.Tables["OrderDetails"].Columns["OrderID"],
false).Nested = true;
XmlDataDocument xmlDoc = new XmlDataDocument(dataSet);
XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes(
"descendant::Customers[*/OrderDetails/ProductID=43]");
DataRow dataRow;
foreach (XmlNode xmlNode in nodeList)
{
dataRow = xmlDoc.GetRowFromElement((XmlElement)xmlNode);
if (dataRow != null)
Console.WriteLine(dataRow[0]);
}