Freigeben über


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

Die Beziehung zwischen einer synchronisierten DataSet und XmlDataDocument ermöglicht die Nutzung von XML-Diensten, wie zum Beispiel der XML Path Language (XPath)-Abfrage, die auf XmlDataDocument zugreifen und bestimmte Funktionen bequemer ausführen können, als wenn direkt auf DataSet zugegriffen wird. Anstatt beispielsweise die Select-Methode eines DataTable-Objekts zum Navigieren durch Beziehungen zu anderen Tabellen in einem DataSet zu verwenden, können Sie eine XPath-Abfrage für ein mit dem DataSet synchronisiertes XmlDataDocument ausführen, um eine Liste von XML-Elementen in Form eines XmlNodeList zu erhalten. Die Knoten in der XmlNodeList, die als XmlElement Knoten umgewandelt werden, können dann an die GetRowFromElement Methode des XmlDataDocument übergeben werden, um übereinstimmende DataRow Verweise auf die Zeilen der Tabelle im synchronisierten DataSet zurückzugeben.

Im folgenden Codebeispiel wird beispielsweise eine XPath-Abfrage "grandchild" ausgeführt. Die DataSet Tabelle ist mit drei Tabellen gefüllt: "Kunden", " Bestellungen" und "Bestelldetails". Im Beispiel wird zunächst eine übergeordnete Beziehung zwischen den Tabellen Customers und Orders erstellt sowie zwischen den Tabellen Orders und OrderDetails. Anschließend wird eine XPath-Abfrage ausgeführt, um eine Sammlung von XmlNodeList-Customers-Knoten zurückzugeben, bei denen es einen Enkel-OrderDetails-Knoten gibt, der einen ProductID-Knoten mit dem Wert 43 enthält. Im Wesentlichen wird in dem Beispiel die XPath-Abfrage verwendet, um zu bestimmen, welche Kunden ein Produkt mit der Kennung ProductID von 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