Så här skriver du frågor på XML i namnområden (LINQ till XML)

Om du vill skriva en fråga i XML som finns i ett namnområde måste du använda XName objekt som har rätt namnrymd.

För C#är den vanligaste metoden att initiera en XNamespace med hjälp av en sträng som innehåller URI:n och sedan använda additionsoperatorns överlagring för att kombinera namnområdet med det lokala namnet.

För Visual Basic är den vanligaste metoden att definiera ett globalt namnområde och sedan använda XML-literaler och XML-egenskaper som använder det globala namnområdet. Du kan definiera ett globalt standardnamnområde, i vilket fall element i XML-literalerna kommer att finnas i namnområdet som standard. Du kan också definiera ett globalt namnområde med ett prefix och sedan använda prefixet som krävs i XML-literalerna och i XML-egenskaperna. Precis som med andra former av XML finns attributen alltid i inget namnområde som standard.

Det första exemplet i den här artikeln visar hur du skapar ett XML-träd i ett standardnamnområde. Den andra visar hur du skapar ett XML-träd i ett namnområde med ett prefix.

Exempel: Skapa ett träd i ett standardnamnområde och hämta element

I följande exempel skapas ett XML-träd som finns i ett standardnamnområde och hämtar sedan en samling element.

XNamespace aw = "http://www.adventure-works.com";
XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <AnotherChild>4</AnotherChild>
    <AnotherChild>5</AnotherChild>
    <AnotherChild>6</AnotherChild>
</Root>");
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>
                <Child>1</Child>
                <Child>2</Child>
                <Child>3</Child>
                <AnotherChild>4</AnotherChild>
                <AnotherChild>5</AnotherChild>
                <AnotherChild>6</AnotherChild>
            </Root>
        Dim c1 As IEnumerable(Of XElement) = _
            From el In root.<Child> _
            Select el
        For Each el As XElement In c1
            Console.WriteLine(el.Value)
        Next
    End Sub
End Module

Det här exemplet genererar följande utdata:

1
2
3

Exempel: Skapa ett träd i ett namnområde med ett prefix och hämta element

I C# skriver du frågor på samma sätt oavsett om du skriver frågor i ett XML-träd som använder ett namnområde med ett prefix eller i ett XML-träd med ett standardnamnområde.

I följande exempel skapas ett XML-träd som finns i ett namnområde med ett prefix och hämtar sedan en samling element.

XNamespace aw = "http://www.adventure-works.com";
XElement root = XElement.Parse(
@"<aw:Root xmlns:aw='http://www.adventure-works.com'>
    <aw:Child>1</aw:Child>
    <aw:Child>2</aw:Child>
    <aw:Child>3</aw:Child>
    <aw:AnotherChild>4</aw:AnotherChild>
    <aw:AnotherChild>5</aw:AnotherChild>
    <aw:AnotherChild>6</aw:AnotherChild>
</aw:Root>");
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <aw:Root>
                <aw:Child>1</aw:Child>
                <aw:Child>2</aw:Child>
                <aw:Child>3</aw:Child>
                <aw:AnotherChild>4</aw:AnotherChild>
                <aw:AnotherChild>5</aw:AnotherChild>
                <aw:AnotherChild>6</aw:AnotherChild>
            </aw:Root>
        Dim c1 As IEnumerable(Of XElement) = _
            From el In root.<aw:Child> _
            Select el
        For Each el As XElement In c1
            Console.WriteLine(CInt(el))
        Next
    End Sub
End Module

Det här exemplet genererar följande utdata:

1
2
3

Se även