对数据集执行 XPath 查询 (ADO.NET)

更新:November 2007

通过同步的 DataSetXmlDataDocument 之间的关系,使您可以使用 XML 服务(例如 XML 路径语言 (XPath) 查询)访问 XmlDataDocument,并且可以比直接访问 DataSet 更方便地执行某些功能。 例如,不必使用 DataTableSelect 方法将关系导航到 DataSet 中的其他表,而可以对与 DataSet 同步的 XmlDataDocument 执行 XPath 查询,从而以 XmlNodeList 形式获取 XML 元素的列表。 XmlNodeList 中的节点将强制转换为 XmlElement 节点,然后可以传递到 XmlDataDocumentGetRowFromElement 方法,以返回对同步 DataSet 中表行的匹配 DataRow 引用。

例如,以下代码示例执行“孙级”XPath 查询。 DataSet 由三个表进行填充: CustomersOrdersOrderDetails。在该示例中,将首先在 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]);
}

请参见

其他资源

数据集与 XmlDataDocument 同步 (ADO.NET)