Jak znaleźć wszystkie węzły w przestrzeni nazw (LINQ to XML)
Możesz filtrować przestrzeń nazw każdego elementu lub atrybutu, aby znaleźć wszystkie węzły w tej konkretnej przestrzeni nazw.
Przykład: tworzenie drzewa XML z dwiema przestrzeniami nazw i drukowanie zawartości jednej
Poniższy przykład tworzy drzewo XML z dwoma przestrzeniami nazw. Następnie wykonuje iterację po drzewie i wyświetla nazwy wszystkich elementów i atrybutów w jednej z tych przestrzeni nazw.
string markup = @"<aw:Root xmlns:aw='http://www.adventure-works.com' xmlns:fc='www.fourthcoffee.com'>
<fc:Child1>abc</fc:Child1>
<fc:Child2>def</fc:Child2>
<aw:Child3>ghi</aw:Child3>
<fc:Child4>
<fc:GrandChild1>jkl</fc:GrandChild1>
<aw:GrandChild2>mno</aw:GrandChild2>
</fc:Child4>
</aw:Root>";
XElement xmlTree = XElement.Parse(markup);
Console.WriteLine("Nodes in the http://www.adventure-works.com namespace");
IEnumerable<XElement> awElements =
from el in xmlTree.Descendants()
where el.Name.Namespace == "http://www.adventure-works.com"
select el;
foreach (XElement el in awElements)
Console.WriteLine(el.Name.ToString());
Imports <xmlns:aw="http://www.adventure-works.com">
Imports <xmlns:fc="www.fourthcoffee.com">
Module Module1
Sub Main()
Dim xmlTree As XElement = _
<aw:Root>
<fc:Child1>abc</fc:Child1>
<fc:Child2>def</fc:Child2>
<aw:Child3>ghi</aw:Child3>
<fc:Child4>
<fc:GrandChild1>jkl</fc:GrandChild1>
<aw:GrandChild2>mno</aw:GrandChild2>
</fc:Child4>
</aw:Root>
Console.WriteLine("Nodes in the http://www.adventure-works.com namespace")
Dim awElements As IEnumerable(Of XElement) = _
From el In xmlTree.Descendants() _
Where (el.Name.Namespace = GetXmlNamespace(aw)) _
Select el
For Each el As XElement In awElements
Console.WriteLine(el.Name.ToString())
Next
End Sub
End Module
Ten przykład generuje następujące wyniki:
Nodes in the http://www.adventure-works.com namespace
{http://www.adventure-works.com}Child3
{http://www.adventure-works.com}GrandChild2
Przykład: tworzenie drzewa XML z jednej z dwóch przestrzeni nazw zawartych w pliku
Przykładowy plik XML dokumentu XML: Skonsolidowane zamówienia zakupu zawierają zamówienia zakupu w dwóch różnych przestrzeniach nazw. Poniższe zapytanie tworzy nowe drzewo na podstawie elementów jednego z nich.
XDocument cpo = XDocument.Load("ConsolidatedPurchaseOrders.xml");
XNamespace aw = "http://www.adventure-works.com";
XElement newTree = new XElement("Root",
from el in cpo.Root.Elements()
where el.Name.Namespace == aw
select el
);
Console.WriteLine(newTree);
Imports <xmlns:aw="http://www.adventure-works.com">
Module Module1
Sub Main()
Dim cpo As XDocument = XDocument.Load("ConsolidatedPurchaseOrders.xml")
Dim newTree As XElement = _
<Root>
<%= From el In cpo.Root.Elements() _
Where el.Name.Namespace = GetXmlNamespace(aw) _
Select el %>
</Root>
Console.WriteLine(newTree)
End Sub
End Module
Ten przykład generuje następujące wyniki:
<Root>
<aw:PurchaseOrder PONumber="11223" Date="2000-01-15" xmlns:aw="http://www.adventure-works.com">
<aw:ShippingAddress>
<aw:Name>Chris Preston</aw:Name>
<aw:Street>123 Main St.</aw:Street>
<aw:City>Seattle</aw:City>
<aw:State>WA</aw:State>
<aw:Zip>98113</aw:Zip>
<aw:Country>USA</aw:Country>
</aw:ShippingAddress>
<aw:BillingAddress>
<aw:Name>Chris Preston</aw:Name>
<aw:Street>123 Main St.</aw:Street>
<aw:City>Seattle</aw:City>
<aw:State>WA</aw:State>
<aw:Zip>98113</aw:Zip>
<aw:Country>USA</aw:Country>
</aw:BillingAddress>
<aw:DeliveryInstructions>Ship only complete order.</aw:DeliveryInstructions>
<aw:Item PartNum="LIT-01">
<aw:ProductID>Litware Networking Card</aw:ProductID>
<aw:Qty>1</aw:Qty>
<aw:Price>20.99</aw:Price>
</aw:Item>
<aw:Item PartNum="LIT-25">
<aw:ProductID>Litware 17in LCD Monitor</aw:ProductID>
<aw:Qty>1</aw:Qty>
<aw:Price>199.99</aw:Price>
</aw:Item>
</aw:PurchaseOrder>
</Root>