Arbeta med globala namnområden i Visual Basic (LINQ till XML)

En av de viktigaste funktionerna i XML-literaler i Visual Basic är möjligheten att deklarera XML-namnområden med hjälp av -instruktionen Imports . Med den här funktionen kan du deklarera ett XML-namnområde som använder ett prefix eller deklarera ett XML-standardnamnområde.

Den här funktionen är användbar i två situationer:

  • Namnområden som deklareras i XML-literaler överförs inte till inbäddade uttryck. Om du deklarerar globala namnområden minskar mängden arbete som krävs för att använda inbäddade uttryck med namnområden.
  • Du måste deklarera globala namnområden för att kunna använda namnområden med XML-egenskaper.

Du kan deklarera globala namnområden på projektnivå. Du kan också deklarera globala namnområden på modulnivå, vilket åsidosätter globala namnområden på projektnivå. Slutligen kan du åsidosätta globala namnområden i en XML-literal.

När du använder XML-literaler eller XML-egenskaper som finns i globalt deklarerade namnområden kan du se det utökade namnet på XML-literaler eller egenskaper genom att hovra över dem i Visual Studio. Det utökade namnet visas i en knappbeskrivning.

Du kan hämta ett XNamespace objekt som motsvarar ett globalt namnområde med hjälp av GetXmlNamespace metoden .

Exempel: Använd Imports för att deklarera ett globalt namnområde

I följande exempel deklareras ett standard globalt namnområde med -instruktionen Imports och initierar sedan ett XElement objekt i namnområdet med en XML-literal:

Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = <Root/>
        Console.WriteLine(root)
    End Sub
End Module

Det här exemplet genererar följande utdata:

<Root xmlns="http://www.adventure-works.com" />

Exempel: Deklarera ett globalt namnområde som har ett prefix

Nästa exempel deklarerar ett globalt namnområde med ett prefix och initierar ett element med en XML-literal:

Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = <aw:Root/>
        Console.WriteLine(root)
    End Sub
End Module

Det här exemplet genererar följande utdata:

<aw:Root xmlns:aw="http://www.adventure-works.com" />

Exempel: Deklarera ett standardnamnområde och använd ett inbäddat uttryck för elementet Child

Namnområden som deklareras i XML-literaler överförs inte till inbäddade uttryck. I följande exempel deklareras ett standardnamnområde och sedan används ett inbäddat uttryck för elementet Child .

Dim root As XElement = _
    <Root xmlns="http://www.adventure-works.com">
        <%= <Child/> %>
    </Root>
Console.WriteLine(root)

Det här exemplet genererar följande utdata:

<Root xmlns="http://www.adventure-works.com">
  <Child xmlns="" />
</Root>

Den resulterande XML-koden innehåller en deklaration av ett standardnamnområde så att elementet Child inte finns i något namnområde.

Du kan deklarera ett annat namnområde i det inbäddade uttrycket enligt följande:

Dim root As XElement = _
    <Root xmlns="http://www.adventure-works.com">
        <%= <Child xmlns="http://www.adventure-works.com"/> %>
    </Root>
Console.WriteLine(root)

Det här exemplet genererar följande utdata:

<Root xmlns="http://www.adventure-works.com">
  <Child xmlns="http://www.adventure-works.com" />
</Root>

Med det globala standardnamnområdet kan du dock använda XML-literaler utan att deklarera namnområden. Den resulterande XML-koden kommer att finnas i det globalt deklarerade standardnamnområdet, som i det här exemplet:

Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = <Root>
                                   <%= <Child/> %>
                               </Root>
        Console.WriteLine(root)
    End Sub
End Module

Det här exemplet genererar följande utdata:

<Root xmlns="http://www.adventure-works.com">
  <Child />
</Root>

Exempel: Använda namnområden med XML-egenskaper

Om du arbetar med ett XML-träd som finns i ett namnområde och du använder XML-egenskaper måste du använda ett globalt namnområde så att XML-egenskaperna också finns i rätt namnområde. I följande exempel deklareras ett XML-träd i ett namnområde och sedan skrivs antalet Child element ut.

Dim root As XElement = _
    <Root xmlns="http://www.adventure-works.com">
        <Child>content</Child>
    </Root>
Console.WriteLine(root.<Child>.Count())

Det här exemplet anger att det inte finns några Child element. Den genererar följande utdata:

0

Om du däremot deklarerar ett globalt standardnamnområde finns både XML-literalen och XML-egenskapen i det globala standardnamnområdet:

Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>
                <Child>content</Child>
            </Root>
        Console.WriteLine(root.<Child>.Count())
    End Sub
End Module

Det här exemplet anger att det finns ett Child element. Den genererar följande utdata:

1

Om du deklarerar ett globalt namnområde som har ett prefix kan du använda prefixet för både XML-literaler och XML-egenskaper:

Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <aw:Root>
                <aw:Child>content</aw:Child>
            </aw:Root>
        Console.WriteLine(root.<aw:Child>.Count())
    End Sub
End Module

Exempel: Använd GetXmlNamespace för att hämta en XNamespace

Du kan erhålla ett XNamespace objekt genom att använda GetXmlNamespace metoden:

Imports <xmlns:aw="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = <aw:Root/>
        Dim xn As XNamespace = GetXmlNamespace(aw)
        Console.WriteLine(xn)
    End Sub
End Module

Det här exemplet genererar följande utdata:

http://www.adventure-works.com

Se även