Compartir a través de


Realizar una consulta de XPath en DataSet

La relación existente entre un DataSet y un XmlDataDocument sincronizados le proporciona servicios XML, como la consulta XPath (XML Path Language), que tiene acceso al XmlDataDocument y puede realizar ciertas funciones más cómodamente que si tuviera acceso directamente al DataSet. Por ejemplo, en lugar de utilizar el método Select de una DataTable para explorar relaciones con otras tablas de un DataSet, puede realizar una consulta de XPath en un XmlDataDocument sincronizado con el DataSet para obtener una lista de elementos XML en forma de una XmlNodeList. Los nodos de la XmlNodeList, convertidos en nodos XmlElement, se pueden pasar entonces al método GetRowFromElement del XmlDataDocument para devolver referencias de DataRow coincidentes con las filas de la tabla del DataSet sincronizado.

Por ejemplo, en el siguiente ejemplo de código se realiza una consulta "secundaria" de XPath. El DataSet se rellena con tres tablas: Customers, Orders y OrderDetails. En el ejemplo se crea primero una relación primaria-secundaria entre las tablas Customers y Orders, y entre las tablas Orders y OrderDetails. Después se realiza una consulta XPath para devolver una XmlNodeList de nodos de Customers donde un nodo secundario de OrderDetails tiene un nodo ProductID con el valor 43. El ejemplo utiliza la consulta XPath para determinar qué clientes han pedido el producto cuyo ProductID es 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]);
    }
  }
}

Vea también

Sincronizar DataSet con XmlDataDocument