Compartir a través de


Realización de una consulta XPath en un conjunto de datos

La relación entre un elemento sincronizado DataSet y XmlDataDocument permite usar servicios XML, como la consulta de Lenguaje de Ruta de Acceso XML (XPath), que acceden a XmlDataDocument y pueden realizar ciertas funciones de forma más cómoda que acceder directamente al DataSet. Por ejemplo, en lugar de usar el Select método para DataTable navegar por las relaciones con otras tablas de un DataSet, puede realizar una consulta XPath en un XmlDataDocument que se sincronice con el DataSet, para obtener una lista de elementos XML en forma de XmlNodeList. Los nodos de XmlNodeList, convertidos en nodos XmlElement, se pueden pasar al método GetRowFromElement de XmlDataDocument, para devolver referencias DataRow coincidentes a las filas de la tabla en el DataSet sincronizado.

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

Consulte también