Procedimiento para escribir consultas con filtrado complejo (LINQ to XML)
Es posible que desee escribir consultas LINQ to XML con filtros complejos. Por ejemplo, quizás debe buscar todos los elementos que tienen un elemento secundario con un valor y un nombre específicos. En este artículo se proporciona un ejemplo de escritura de una consulta con filtrado complejo.
Ejemplo: Búsqueda con una consulta anidada en la cláusula Where
En este ejemplo se muestra cómo buscar todos los elementos PurchaseOrder
que tienen:
- Un elemento secundario
Address
cuyo atributoType
es igual a "Shipping". - Un elemento secundario
State
que es igual a "NY".
Utiliza una consulta anidada en la cláusula Where
y el operador Any
devuelve true
si la colección tiene elementos en ella. En el ejemplo se usa el documento XML Archivo XML de ejemplo: varios pedidos de compra.
Para obtener más información sobre el operador Any
, vea Operaciones cuantificadoras (C#) y Operaciones de cuantificador (Visual Basic).
XElement root = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> purchaseOrders =
from el in root.Elements("PurchaseOrder")
where
(from add in el.Elements("Address")
where
(string)add.Attribute("Type") == "Shipping" &&
(string)add.Element("State") == "NY"
select add)
.Any()
select el;
foreach (XElement el in purchaseOrders)
Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));
Dim root As XElement = XElement.Load("PurchaseOrders.xml")
Dim purchaseOrders As IEnumerable(Of XElement) = _
From el In root.<PurchaseOrder> _
Where _
(From add In el.<Address> _
Where _
add.@Type = "Shipping" And _
add.<State>.Value = "NY" _
Select add) _
.Any() _
Select el
For Each el As XElement In purchaseOrders
Console.WriteLine(el.@PurchaseOrderNumber)
Next
Este ejemplo produce el siguiente resultado:
99505
Ejemplo: Búsqueda en XML que se encuentra en un espacio de nombres
En el siguiente ejemplo se muestra la misma consulta que arriba, pero para XML que se encuentra en un espacio de nombres. Para obtener más información, vea Introducción a los espacios de nombres.
En este ejemplo se usa el documento XML: Archivo XML de ejemplo: varios pedidos de compra en un espacio de nombres.
XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> purchaseOrders =
from el in root.Elements(aw + "PurchaseOrder")
where
(from add in el.Elements(aw + "Address")
where
(string)add.Attribute(aw + "Type") == "Shipping" &&
(string)add.Element(aw + "State") == "NY"
select add)
.Any()
select el;
foreach (XElement el in purchaseOrders)
Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));
Imports <xmlns:aw='http://www.adventure-works.com'>
Module Module1
Sub Main()
Dim root As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
Dim purchaseOrders As IEnumerable(Of XElement) = _
From el In root.<aw:PurchaseOrder> _
Where _
(From add In el.<aw:Address> _
Where _
add.@aw:Type = "Shipping" And _
add.<aw:State>.Value = "NY" _
Select add) _
.Any() _
Select el
For Each el As XElement In purchaseOrders
Console.WriteLine(el.@aw:PurchaseOrderNumber)
Next
End Sub
End Module
Este ejemplo produce el siguiente resultado:
99505
Consulte también
- Attribute
- Elements
- Operaciones de proyección [C#]
- Operaciones cuantificadoras [C#]
- Propiedades de eje secundario XML (Visual Basic)
- Propiedad de eje para atributos XML (Visual Basic)
- Value (Propiedad XML) (Visual Basic)
- Operaciones de proyección (Visual Basic)
- Operaciones de cuantificador (Visual Basic)