次の方法で共有


System.Xml.Linq.XName クラス

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

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

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

XName にはパブリック コンストラクターが含まれていません。 その代わりに、このクラスはStringからXNameを作成するための暗黙的な変換を提供します。 この変換を使用する最も一般的な場所は、要素または属性を構築する場合です。 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 リテラルが使用されている場合でも、XNameに対してXElement オブジェクトが作成されます。

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

名前空間に 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 を作成する

Namespace オブジェクトの XName プロパティは、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.

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

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

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 つの参照が実際に同じオブジェクトを参照していることを確認する方がはるかに高速です。