グローバル名前空間の使用 (Visual Basic) (LINQ to XML)

Visual Basic での XML リテラルの重要な機能の 1 つは、Imports ステートメントを使用して XML 名前空間を宣言できることです。 この機能を使用することで、プレフィックスを使用する XML 名前空間または既定の XML 名前空間を宣言できます。

この機能は 2 つの状況で役立ちます。

  • XML リテラルで宣言された名前空間は、組み込み式に引き継がれません。 グローバル名前空間を宣言すると、名前空間を伴う組み込み式を使用しなければならない作業が軽減されます。
  • 名前空間と XML プロパティを併用するためには、グローバル名前空間を宣言する必要があります。

グローバル名前空間はプロジェクト レベルで宣言できます。 また、モジュール レベルでもグローバル名前空間を宣言できます。その場合、プロジェクト レベルのグローバル名前空間はオーバーライドされます。 最終的に、グローバル名前空間は XML リテラルでオーバーライドできます。

グローバルに宣言された名前空間に含まれる XML リテラルまたは XML プロパティを使用する場合は、Visual Studio で XML リテラルまたはプロパティにカーソルを合わせることで、それらの展開名が表示されます。 拡張名はツールヒントに表示されます。

グローバル名前空間に対応する XNamespace オブジェクトを取得するには、GetXmlNamespace メソッドを使用します。

例: Imports を使用してグローバル名前空間を宣言する

次の例では、Imports ステートメントを使用して既定のグローバル名前空間を宣言し、XML リテラルを使用してその名前空間内で XElement オブジェクトを初期化します。

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

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

この例を実行すると、次の出力が生成されます。

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

例: プレフィックスが付いたグローバル名前空間を宣言する

次の例では、プレフィックスを付けてグローバル名前空間を宣言し、XML リテラルを使用して要素を初期化します。

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

この例を実行すると、次の出力が生成されます。

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

例: 既定の名前空間を宣言し、Child 要素に埋め込み式を使用する

XML リテラルで宣言される名前空間は、組み込み式に引き継がれません。 次の例では、既定の名前空間を宣言し、Child 要素に埋め込み式を使用します。

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

この例を実行すると、次の出力が生成されます。

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

結果的に生成される XML では、Child 要素がどの名前空間にも属さないように、既定の名前空間の宣言が含まれています。

次のように、組み込み式で別の名前空間を宣言できます。

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

この例を実行すると、次の出力が生成されます。

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

ただし、既定のグローバル名前空間を使用することで、名前空間を宣言せずに XML リテラルを使用できます。 結果的に生成される XML は、この例のように、グローバルに宣言された既定の名前空間に属することになります。

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

この例を実行すると、次の出力が生成されます。

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

例: 名前空間と XML プロパティを併用する

名前空間に含まれている XML ツリーを操作する場合に XML プロパティを使用するときは、XML プロパティが正しい名前空間に含まれるように、グローバル名前空間を使用する必要があります。 次の例では、名前空間で XML ツリーを宣言し、Child 要素の数を出力します。

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

この例は Child 要素が存在しないことを示しています。 次が出力されます。

0

ただし、既定のグローバル名前空間を宣言すると、XML リテラルと XML プロパティの両方が既定のグローバル名前空間に含まれます。

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

この例は、Child 要素が 1 つ存在することを示しています。 次が出力されます。

1

プレフィックスを持つグローバル名前空間を宣言すると、そのプレフィックスを XML リテラルと XML プロパティの両方で使用できます。

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

例: GetXmlNamespace を使用して XNamespace を取得する

GetXmlNamespace メソッドを使用して XNamespace オブジェクトを取得できます。

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

この例を実行すると、次の出力が生成されます。

http://www.adventure-works.com

関連項目