Karmaşık filtreleme ile sorgu yazma (LINQ to XML)
Bazen karmaşık filtreler içeren XML sorgularına LINQ yazmak isteyebilirsiniz. Örneğin, belirli bir ada ve değere sahip bir alt öğeye sahip tüm öğeleri bulmanız gerekebilir. Bu makalede, karmaşık filtreleme ile sorgu yazma örneği verilmektedir.
Örnek: Yan tümcesinde Where
iç içe bir sorguyla bulma
Bu örnek, aşağıdakilere sahip tüm PurchaseOrder
öğelerin nasıl bulunduğunu gösterir:
- Özniteliği "Shipping" değerine eşit olan
Type
bir altAddress
öğe. - "NY" değerine eşit bir alt
State
öğe.
Yan tümcesinde Where
iç içe yerleştirilmiş bir sorgu kullanır ve Any
koleksiyonda herhangi bir öğe varsa işleç döndürür true
. Örnekte XML belgesi Örnek XML dosyası kullanılmaktadır: Birden çok satın alma siparişi.
işleci hakkında Any
daha fazla bilgi için bkz . Niceleyici İşlemleri (C#) ve Niceleyici İşlemleri (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
Bu örnek aşağıdaki çıkışı oluşturur:
99505
Örnek: Ad alanında bulunan XML'de bulma
Aşağıdaki örnek, yukarıdakiyle aynı sorguyu ancak ad alanında bulunan XML'yi gösterir. Daha fazla bilgi için bkz . Ad alanlarına genel bakış.
Bu örnekte XML belgesi Örnek XML dosyası kullanılmaktadır: Bir ad alanında birden çok satın alma siparişi.
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
Bu örnek aşağıdaki çıkışı oluşturur:
99505