System.Xml.Linq.XName クラス

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

XML 名には、名前空間とローカル名が含まれます。 "完全修飾名" は、名前空間とローカル名の組み合わせです。

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

XName にはパブリック コンストラクターが含まれていません。 代わりに、このクラスは XName を作成できる String からの暗黙的な変換を提供します。 この変換を使用する最も一般的な場所は、要素または属性を構築するときで、XElement コンストラクターの最初の引数は XName となります。 文字列を渡すことで、暗黙的な変換を利用できます。 次のコードは、名前空間外にある名前を持つ要素を作成します。

XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);

Visual Basic では、以下のように XML リテラルを使用する方が適切です。

Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)

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

<ElementName>content</ElementName>

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

Visual Basic の例は、XML リテラルを使用して XElement を作成します。 XML リテラルが使用されていますが、XElement に対する XName オブジェクトが作成されています。

さらに、XName オブジェクトの Get メソッドを呼び出すこともできます。 ただし、推奨される方法は、文字列からの暗黙的な変換の使用です。

名前空間内に XName を作成する

XML と同様に、XName は名前空間内に置くことも、名前空間外に置くことも可能です。

C# の場合、名前空間内に XName を作成するための推奨される方法は、XNamespace オブジェクトを宣言してから、加算演算子のオーバーライドを使用することです。

Visual Basic の場合、推奨される方法は、XML リテラルとグローバル名前空間宣言を使用して、名前空間内の XML を作成することです。

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "ElementName", "content");
Console.WriteLine(root);
Imports <xmlns="http://www.adventure-works.com">

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

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

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

名前空間外に XName を作成する

XName オブジェクトの Namespace プロパティは null 値ではないことが保証されています。 XName が名前空間外にある場合、Namespace プロパティは None に設定されます。 その例を次のコードに示します。

XElement root = new XElement("ElementName", "content");
if (root.Name.Namespace == XNamespace.None)
    Console.WriteLine("The element is in no namespace.");
else
    Console.WriteLine("The element is in a namespace.");
Dim root As XElement = <ElementName>content</ElementName>
If (root.Name.Namespace Is XNamespace.None) Then
    Console.WriteLine("The element is in no namespace.")
Else
    Console.WriteLine("The element is in a namespace.")
End If

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

The element is in no namespace.

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

以下のように {namespace}localname の形式の展開された名前から XName を作成することもできます。

XElement root = new XElement("{http://www.adventure-works.com}ElementName", "content");
Console.WriteLine(root);
Dim root As XElement = New XElement("{http://www.adventure-works.com}ElementName", "content")
Console.WriteLine(root)

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

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

展開された名前を通した XName の作成は、XNamespace オブジェクトを作成して加算演算子のオーバーライドを使用するよりも効率が悪いことに注意してください。 また、Visual Basic でグローバル名前空間をインポートし、XML リテラルを使用するよりも効率が悪くなります。

展開された名前を使用して XName を作成する場合、LINQ to XML は名前空間のアトミック化されたインスタンスを見つける必要があります。 この作業は、展開された名前の使用のたびに繰り返す必要があります。 この余分な時間は、LINQ クエリの記述の際にはごくわずかですが、大きな XML ツリーを作成する際には大きなものとなる可能性があります。

XName オブジェクトはアトミック化される

XName オブジェクトはアトミック化されることが保証されています。つまり、2 つの XName オブジェクトが、まったく同じ名前空間とまったく同じローカル名を持つ場合、これらは同じインスタンスを共有することになります。 等値演算子と比較演算子も、明確にこの目的のために提供されています。

この特徴は、その他の利点の中でもとりわけ、クエリの実行の高速化に寄与しています。 要素または属性の名前でのフィルター処理の際、述語で表される比較は、値比較ではなく、ID 比較を使用します。 2 つの文字列を比較するよりも、2 つの参照が実際に同じオブジェクトを参照していることを確認する方がはるかに高速です。