Zincir eksen yöntem çağrıları (LINQ to XML)
Kodunuzda kullanacağınız yaygın bir desen, bir eksen yöntemini çağırmak ve ardından uzantı yöntemi eksenlerinden birini çağırmaktır.
Bir öğe koleksiyonu döndüren adlı Elements
iki eksen vardır: XContainer.Elements yöntemi ve Extensions.Elements yöntemi. Belirtilen adın tüm öğelerini ağaçta belirli bir derinlikte bulmak için bu iki ekseni birleştirebilirsiniz.
Örnek: Tüm ad öğelerini alma
Bu örnek, tüm öğelerdeki tüm öğelerdeki tüm Address
Name
öğeleri PurchaseOrder
almak için ve Extensions.Elements kullanırXContainer.Elements.
Bu örnekte XML belgesi Örnek XML dosyası kullanılır: Birden çok satın alma siparişi.
XElement purchaseOrders = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> names =
from el in purchaseOrders
.Elements("PurchaseOrder")
.Elements("Address")
.Elements("Name")
select el;
foreach (XElement e in names)
Console.WriteLine(e);
Dim purchaseOrders As XElement = XElement.Load("PurchaseOrders.xml")
Dim names As IEnumerable(Of XElement) = _
From el In purchaseOrders.<PurchaseOrder>.<Address>.<Name> _
Select el
For Each e As XElement In names
Console.WriteLine(e)
Next
Bu örnek aşağıdaki çıkışı oluşturur:
<Name>Ellen Adams</Name>
<Name>Tai Yee</Name>
<Name>Cristian Osorio</Name>
<Name>Cristian Osorio</Name>
<Name>Jessica Arnold</Name>
<Name>Jessica Arnold</Name>
Bu işe yarar çünkü eksenin uygulamalarından Elements
biri üzerinde IEnumerable<T>XContainerbir uzantı yöntemidir. XElement yönteminden XContainertüretilir, böylece yöntemine Extensions.Elements yapılan çağrının sonuçlarında yöntemini çağırabilirsiniz XContainer.Elements .
Örnek: Belirli bir derinlikte tüm öğeleri alma
Bazen, belirli bir öğe derinliğindeki tüm öğeleri, araya girmekte olan üst öğeler olmayabilirken almak istersiniz. Örneğin, aşağıdaki belgede öğenin alt Customer
öğesi olan tüm ConfigParameter
öğeleri almak isteyebilirsiniz, ancak öğenin alt Root
öğesi değildirConfigParameter
.
<Root>
<ConfigParameter>RootConfigParameter</ConfigParameter>
<Customer>
<Name>Frank</Name>
<Config>
<ConfigParameter>FirstConfigParameter</ConfigParameter>
</Config>
</Customer>
<Customer>
<Name>Bob</Name>
<!--This customer doesn't have a Config element-->
</Customer>
<Customer>
<Name>Bill</Name>
<Config>
<ConfigParameter>SecondConfigParameter</ConfigParameter>
</Config>
</Customer>
</Root>
Bunu yapmak için ekseni aşağıdaki gibi kullanabilirsiniz Extensions.Elements :
XElement root = XElement.Load("Irregular.xml");
IEnumerable<XElement> configParameters =
root.Elements("Customer").Elements("Config").
Elements("ConfigParameter");
foreach (XElement cp in configParameters)
Console.WriteLine(cp);
Dim root As XElement = XElement.Load("Irregular.xml")
Dim configParameters As IEnumerable(Of XElement) = _
root.<Customer>.<Config>.<ConfigParameter>
For Each cp As XElement In configParameters
Console.WriteLine(cp)
Next
Bu örnek aşağıdaki çıkışı oluşturur:
<ConfigParameter>FirstConfigParameter</ConfigParameter>
<ConfigParameter>SecondConfigParameter</ConfigParameter>
Örnek: Ad alanındaki XML öğelerini alma
Aşağıdaki örnek, ad alanında bulunan XML için aynı tekniği 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.
XNamespace aw = "http://www.adventure-works.com";
XElement purchaseOrders = XElement.Load("PurchaseOrdersInNamespace.xml");
IEnumerable<XElement> names =
from el in purchaseOrders
.Elements(aw + "PurchaseOrder")
.Elements(aw + "Address")
.Elements(aw + "Name")
select el;
foreach (XElement e in names)
Console.WriteLine(e);
Imports <xmlns:aw="http://www.adventure-works.com">
Module Module1
Sub Main()
Dim purchaseOrders As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
Dim names As IEnumerable(Of XElement) = _
From el In purchaseOrders.<aw:PurchaseOrder>.<aw:Address>.<aw:Name> _
Select el
For Each e As XElement In names
Console.WriteLine(e)
Next
End Sub
End Module
Bu örnek aşağıdaki çıkışı oluşturur:
<aw:Name xmlns:aw="http://www.adventure-works.com">Ellen Adams</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Tai Yee</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>