Freigeben über


Ausführen einer XPath-Abfrage für ein DataSet

Die Beziehung zwischen einem synchronisierten DataSet und einem XmlDataDocument ermöglicht das Verwenden von XML-Diensten, z. B die XPath-Abfrage (XML Path Language), die auf das XmlDataDocument zugreifen und bestimmte Funktionen komfortabler ausführen können, als dies bei einem direkten Zugriff auf das Dataset der Fall ist. Anstelle der Select-Methode einer DataTable können Sie beispielsweise zum Navigieren über Beziehungen zu anderen Tabellen in einem Dataset auch eine XPath-Abfrage für ein mit dem Dataset synchronisiertes XmlDataDocument ausführen, um eine Liste mit XML-Elementen als XmlNodeList abzurufen. Die in XmlElement-Knoten umgewandelten Knoten der XmlNodeList können der GetRowFromElement-Methode des XmlDataDocument übergeben werden, um übereinstimmende DataRow-Verweise auf die Tabellenzeilen des synchronisierten Dataset zurückzugeben.

Im folgenden Codebeispiel wird eine XPath-Abfrage für Elemente der zweiten Unterebene ausgeführt. Das Dataset wird mit drei Tabellen ausgefüllt: Customers, Orders und OrderDetails. Im Beispiel wird zunächst eine hierarchische Beziehung zwischen der Customers-Tabelle und der Orders-Tabelle sowie zwischen der Orders-Tabelle und der OrderDetails-Tabelle erstellt. Danach wird eine XPath-Abfrage ausgeführt, um eine XmlNodeList von Customers-Knoten zurückzugeben, bei denen ein der Knoten OrderDetails auf der zweiten Unterebene über einen ProductID-Knoten mit dem Wert 43 verfügt. Im Grunde wird in dem Beispiel eine XPath-Abfrage verwendet, um zu bestimmen, welche Kunden das Produkt mit der ProductID 43 bestellt haben.

' 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]);  
}  

Siehe auch