Partager via


Exécution d'une requête XPath sur un DataSet

La relation qui existe entre un DataSet et un XmlDataDocument synchronisés vous permet de disposer des services XML, tels que les requêtes XPath (XML Path Language), qui accèdent au XmlDataDocument et peuvent réaliser certaines opérations plus facilement que si vous deviez accéder directement au DataSet. Par exemple, au lieu d'utiliser la méthode Select d'un DataTable pour suivre les liens vers d'autres tables d'un DataSet, vous pouvez exécuter une requête XPath sur un XmlDataDocument synchronisé avec le DataSet afin d'obtenir une liste d'éléments XML sous la forme d'un XmlNodeList. Les nœuds du XmlNodeList, castés en tant que nœuds XmlElement, peuvent alors être passés à la méthode GetRowFromElement du XmlDataDocument, afin de retourner les références DataRow correspondantes aux lignes de la table du DataSet synchronisé.

Ainsi, l'exemple de code suivant exécute une requête XPath « petit-enfant ». Le DataSet reçoit trois tables : Customers, Orders et OrderDetails. Dans l'exemple, une relation parent-enfant est créée d'abord entre les tables Customers et Orders, puis entre les tables Orders et OrderDetails. Une requête XPath est alors exécutée pour retourner un XmlNodeList des nœuds Customers dans lequel un nœud petit-enfant OrderDetails possède un nœud ProductID de valeur 43. Essentiellement, l'exemple utilise la requête XPath pour identifier les clients qui ont commandé le produit dont la référence ProductID est 43.

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml

Public Class Sample
  Public Shared Sub Main()
    Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI")
    nwindConn.Open()

    Dim myDataSet As DataSet = New DataSet("CustomerOrders")

    Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", nwindConn)
    custDA.Fill(myDataSet, "Customers")

    Dim ordersDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", nwindConn)
    ordersDA.Fill(myDataSet, "Orders")

    Dim detailsDA As SqlDataAdapter = 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

    Dim xmlDoc As XmlDataDocument = New XmlDataDocument(myDataSet) 
      
    Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("descendant::Customers[*/OrderDetails/ProductID=43]")
      
    Dim myRow As DataRow
    Dim myNode As XmlNode

    For Each myNode In nodeList
      myRow = xmlDoc.GetRowFromElement(CType(myNode, XmlElement))

      If Not myRow Is Nothing then Console.WriteLine(myRow(0).ToString())
    Next
  End Sub
End Class
[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]);
    }
  }
}

Voir aussi

Synchronisation d'un DataSet avec un XmlDataDocument