Cara menulis kueri dengan pemfilteran kompleks (LINQ ke XML)
Terkadang Anda ingin menulis kueri LINQ ke XML dengan filter kompleks. Misalnya, Anda mungkin harus menemukan semua elemen yang memiliki elemen turunan dengan nama dan nilai tertentu. Artikel ini memberikan contoh penulisan kueri dengan pemfilteran yang kompleks.
Contoh: Temukan dengan kueri berlapis dalam klausul Where
Contoh ini menunjukkan cara menemukan semua elemen PurchaseOrder
yang memiliki:
- Elemen turunan
Address
yang atributType
nya sama dengan "Pengiriman". - Elemen turunan
State
yang sama dengan "NY".
Ini menggunakan kueri berlapis dalam Where
klausul Any
, dan operator true
mengembalikan jika koleksi memiliki elemen apa pun di dalamnya. Contohnya menggunakan file XML Sampel dokumen XML: Beberapa pesanan pembelian.
Untuk informasi selengkapnya tentang Any
operator, lihat Operasi Quantifier (C#) dan Operasi Quantifier (Visual Basic) (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
Contoh ini menghasilkan output berikut:
99505
Contoh: Temukan di XML yang ada di namespace
Contoh berikut menunjukkan kueri yang sama seperti di atas, tetapi untuk XML yang ada di namespace. Untuk informasi lebih lanjut, lihat Ringkasan kumpulan nama XML.
Contoh ini menggunakan File XML sampel dokumen XML: Beberapa pesanan pembelian di namespace.
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
Contoh ini menghasilkan output berikut:
99505