XmlNamespaceManager を使用した名前空間の管理

XmlNamespaceManager クラスには、名前空間 URI およびそのプレフィックスのコレクションが保持されます。 名前空間の解決、追加、およびコレクションからの削除を実行できます。 特定のコンテキストで、XML の処理パフォーマンスを向上させるために必要となります。 たとえば、XPath をサポートするには XsltContext クラスで XmlNamespaceManager を使用します。 XsltContext クラスの詳細については、サポート技術情報の文書「[HOWTO] Visual Basic .NET で XPath クエリを実行するときのカスタム拡張関数の実装と使用 (Q324899)」を参照してください。

C# 言語で記述された同じ例については、サポート技術情報の文書「[HOWTO] Visual C# .NET で XPath クエリを実行するときのカスタム拡張関数の実装と使用 (Q324462)」を参照してください。

メモメモ

LINQ to XML を使用する場合、名前空間の管理に XmlNamespaceManager は使用されません。LINQ to XML を使用する際の名前空間の管理については、「XML 名前空間の使用」を参照してください。

名前空間

名前空間マネージャーが作成されると、3 つのプレフィックスがこのクラスに自動的に追加されます。 これら 3 つのプレフィックスと、それぞれが表す名前空間の表を次に示します。

プレフィックス

名前空間

xmlns

http://www.w3.org/2000/xmlns/

xml

http://www.w3.org/XML/1998/namespace

String.Empty

空の名前空間です。 この値をプレフィックスに割り当てることができます。 たとえば、 は、既定の名前空間が空の名前空間であることを定義します。

名前空間マネージャーに名前空間を追加するには、名前空間マネージャーを作成し、AddNamespace メソッドを使用します。 名前空間マネージャーを作成するときには、XmlTextReader クラス、XsltContext クラス、または XmlDocument クラスの NameTable を使用できます。 カスタム オブジェクト XmlNamespaceManager が作成され、AddNamespace メソッドを使用して適切な名前空間宣言が追加されます。 名前空間で修飾された要素名と属性名を参照する XPath クエリ式を実行するために、XmlDocument クラスの SelectNodes メソッドまたは SelectSingleNode メソッドにパラメーターとして XmlNamespaceManager を渡します。 名前空間が追加されるときの前提事項を次に示します。

  • プレフィックスと名前空間が既に確認されており、なおかつ W3C 名前空間仕様に準拠している必要があります。 名前空間マネージャーは名前空間についての確認を実行しません。

  • AddNamespace メソッドを使用して文字列を追加すると、その文字列は名前空間マネージャーによって分解処理されます。

  • LookupNamespace メソッドまたは LookupPrefix メソッドを使用して参照を実行すると、文字列が名前空間マネージャーによって分解処理されます。

  • 作成時に、既定のプレフィックスと名前空間のペアが名前空間マネージャーに自動的に追加されます。

名前空間マネージャーにより、名前空間の追加と取得だけでなく、列挙のサポートも実装されます。 名前空間マネージャー内に保存されている情報を foreach 構成体を使用してループ処理できます。 たとえば、名前空間マネージャーが名前 nsmanager で作成されている場合は、foreach (String prefix in nsmanager) を使用してテーブルを反復処理できます。

名前空間マネージャーには、プレフィックスと名前空間をオブジェクトとして文字列比較する機能があるため、文字列を直接比較するのではなく名前空間マネージャーを使用することでパフォーマンスを向上できます。

名前空間マネージャーに名前空間を追加するには、AddNamespace メソッドを使用します。 プレフィックス xsd と名前空間 URI の http://www.w3.org/2001/XMLSchema を連結する方法を次のコード サンプルに示します。

nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema")
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");

LookupNamespace メソッドを使用して名前空間を検索する方法を次のコード サンプルに示します。

nsmgr.LookupNamespace("xsd")
nsmgr.LookupNamespace("xsd");

名前空間の追加と検索の完全なサンプルについては、「LookupNamespace メソッド」を参照してください。

リーダーの NameTable を使用して XmlNamespaceManager を作成するコード サンプルを次に示します。

Dim reader As New XmlTextReader("myfile.xml")
Dim nsmanager As New XmlNamespaceManager(reader.NameTable)
nsmanager.AddNamespace("msbooks", "www.microsoft.com/books")
nsmanager.PushScope()
nsmanager.AddNamespace("msstore", "www.microsoft.com/store")
While reader.Read()
    Console.WriteLine("Reader Prefix:{0}", reader.Prefix)
    Console.WriteLine("XmlNamespaceManager Prefix:{0}",
     nsmanager.LookupPrefix(nsmanager.NameTable.Get(reader.NamespaceURI)))
End While
XmlTextReader reader = new XmlTextReader("myfile.xml");
XmlNamespaceManager nsmanager = new XmlNamespaceManager(reader.NameTable);
nsmanager.AddNamespace("msbooks", "www.microsoft.com/books");
nsmanager.PushScope();
nsmanager.AddNamespace("msstore", "www.microsoft.com/store");
while (reader.Read())
{
    Console.WriteLine("Reader Prefix:{0}", reader.Prefix);
    Console.WriteLine("XmlNamespaceManager Prefix:{0}",
    nsmanager.LookupPrefix(nsmanager.NameTable.Get(reader.NamespaceURI)));
}

参照

概念

XML ドキュメントにおける名前空間