次の方法で共有


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 オブジェクトはアトミック化することが保証されます。つまり、2 つの XNamespace オブジェクトの URI がまったく同じである場合は、同じインスタンスを共有します。 等価演算子と比較演算子は、この目的のために明示的に提供されます。

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

名前空間とローカル名を指定するもう 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 リテラルを使用することをお勧めします。