System.Xml.Linq.XNamespace クラス

この記事では、この API のリファレンス ドキュメントを補足して解説します。

このクラスは、名前空間の XML コンストラクトを表します。

すべての XName 要素が XNamespace を含みます。 要素が名前空間内になくても、要素の XName には、名前空間 XNamespace.None が含まれています。 XName.Namespace プロパティが null になることはありません。

XNamespace オブジェクトを作成する

XNamespace オブジェクトを作成する最も一般的な方法は、単に文字列を割り当てるだけです。 その後、加算演算子のオーバーライドを使用して、名前空間とローカル名を組み合わせることができます。 次に、表現形式の例を示します。

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root", "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", "Content")
Console.WriteLine(root)

ただし、Visual Basic では、通常、次のようにグローバルな既定の名前空間を宣言します。

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

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

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

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

文字列を XNamespace に割り当てると、String から文字列への暗黙的な変換を使用します。

詳細と例については、「C# で名前空間を持つドキュメントを作成する方法 (LINQ to XML)」を参照してください。

Visual Basic での名前空間の使用に関する詳細については、「XML 名前空間の操作」を参照してください。

名前空間プレフィックスを制御する

名前空間を宣言する属性を作成すると、属性で指定されたプレフィックスがシリアル化された XML に保持されます。 プレフィックスを持つ名前空間を宣言する属性を作成するには、属性の名前の名前空間が Xmlns で、属性の名前が名前空間プレフィックスであるような属性を作成します。 属性の値は、名前空間の URI です。 次に、表現形式の例を示します。

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), _
    "Content")
Console.WriteLine(root)

Visual Basic では、名前空間プレフィックスを制御する名前空間ノードを作成する代わりに、通常はグローバル名前空間の宣言を使用します。

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

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

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

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

詳細については、「名前空間プレフィックスを制御する方法」を参照してください。

既定の名前空間を作成する

名前空間になる属性を構築する際に、属性名の特殊な値が "xmlns" である場合、XML ツリーがシリアル化される際に名前空間が既定の名前空間として宣言されます。 "xmlns" 自体の名前を持つ特殊な属性は、どの名前空間にも含まれていません。 属性の値は、名前空間の URI です。

次の例では、名前空間が既定の名前空間になるように宣言された属性を含む XML ツリーを作成します。

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "content")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute("xmlns", "http://www.adventure-works.com"), _
    New XElement(aw + "Child", "content") _
)
Console.WriteLine(root)

Visual Basic では、既定の名前空間を作成するための名前空間ノードを作成する代わりに、通常は既定のグローバル名前空間の宣言を使用します。

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

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

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

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

XNamespace のアトミック化

XNamespace オブジェクトは分解されることが保証されています。つまり、まったく同じ URI を持つ 2 つの XNamespace オブジェクトは、同一のインスタンスを共有することになります。 等価演算子と比較演算子は、この目的のために明示的に提供されます。

展開された名前を使用する

名前空間とローカル名を指定するもう 1 つの方法は、展開された名前を次の形式 {namespace}name で使用することです。

XElement e = new XElement("{http://www.adventure-works.com}Root",
     new XAttribute("{http://www.adventure-works.com}Att", "content")
);
Console.WriteLine(e);
Dim e As XElement = New XElement("{http://www.adventure-works.com}Root", _
     New XAttribute("{http://www.adventure-works.com}Att", "content") _
)
Console.WriteLine(e)

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

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

ただし、この方法はパフォーマンスに影響を与えます。 拡張名が含まれた文字列を LINQ to XML に渡すたびに、名前を解析し、分解された名前空間を検索し、分解された名前を検索する必要があります。 この処理は CPU 時間を消費します。 パフォーマンスが重要な場合は、別の方法を使用してください。

Visual Basic では、展開された名前を使用しない XML リテラルを使用することをお勧めします。