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

XmlNamespaceManager は、コレクションからの名前空間を解決、コレクションに追加、コレクションから削除するためにデザインされたクラスであり、名前空間のスコープ管理機能が用意されています。名前空間をコレクションに保持するときは、いつでも XmlNamespaceManager クラスを作成できます。コレクションによって、名前空間プリフィックスと URI が関連付けられます。XmlNamespacemanager は、XPath をサポートするために、XsltContext クラスでも使用されます。XsltContextClass の詳細については、サポート技術情報の文書「HOW TO: Implement and Use Custom Extension Functions when you Execute XPath Queries in Visual Basic .NET (Q324899)」を参照してください。

C# 言語で記述された同じ例については、http://support.microsoft.com で、サポート技術情報の文書「HOW TO: Implement and Use Custom Extension Functions when you Execute XPath Queries in Visual C# .NET (Q324462)」を参照してください。

reader からの 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
[C#]
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)));
}

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

プリフィックス 名前空間
xmlns http://www.w3.org/2000/xmlns
xml http://www.w3.org/1998/namespace
String.Empty 空の名前空間です。この値をプリフィックスに割り当てることができます。たとえば、 は、既定の名前空間が空の名前空間であることを定義します。

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

  • プリフィックスと名前空間が既に確認されていて、これらが 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")
[C#]
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");

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

nsmgr.LookupNamespace("xsd")
[C#]
nsmgr.LookupNamespace("xsd");

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

参照

XML ドキュメントにおける名前空間 | 名前空間の宣言 | 既定の名前空間 | 名前空間の宣言のスコープ | XmlNamespaceManager から取得する情報