XmlNamespaceManager から取得する情報

XmlNamespaceManager に格納済みの情報を設定したり取得するタスクを実行するときに使用できるメソッドとプロパティを、次の表に示します。

タスク メソッドまたはプロパティ
既定の名前空間として定義されている namespaceURI を見つける。 DefaultNamespace プロパティ
宣言されていて、プリフィックスのスコープ内の namespaceURI を見つける。 LookupNamespace メソッド
宣言されていて、namespaceURI のスコープ内のプリフィックスを見つける。 LookupPrefix メソッド
追加の名前空間を XmlNamespaceManager に追加する。 AddNamespace メソッド
XmlNamespaceManager から名前空間を削除する。 RemoveNamespace メソッド
名前空間のスコープを指定する。 PushScope メソッドPopScope メソッド
現在のスコープ内にプリフィックスが定義されているかどうかを確認する。 HasNamespace メソッド
XmlNamespaceManager オブジェクトに関連付けられている XmlNameTable を取得する。 NameTable プロパティ

属性を記述するときの LookupPrefix メソッドの使用方法を次の例に示します。この例では、WriteStartAttribute メソッドを使用して属性を開始し、LookupPrefix を使用して urn:samples の namespaceURI のプリフィックスを検索し、ISBN 属性を記述するときに WriteStartAttribute の中でそのプリフィックスを使用しています。

"bk","urn:samples")
Dim prefix As String = nsMgr.LookupPrefix("urn:samples")
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
[C#]
XmlNameTable nt = new XmlNameTable();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nt);
nsMgr.AddNamespace("bk","urn:samples");string prefix = writer nsMgr.LookupPrefix("urn:samples");
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");

LookupPrefix を使用して、要素に対して定義されているプリフィックスを見つける例を次に示します。

writer.WriteStartElement("root", "book")
writer.WriteStartElement("x", "node", "author")
s = writer.LookupPrefix("author")
CError.Compare(s, "x", "Error in nested element")
writer.WriteEndElement()
s = writer.LookupPrefix("book")
CError.Compare(s, Nothing, "Error in root element")
writer.WriteEndElement()
[C#]
writer.WriteStartElement("root", "book");
writer.WriteStartElement("x", "node", "author");
s = writer.LookupPrefix("author");
CError.Compare(s, "x", "Error in nested element");
writer.WriteEndElement();
s = writer.LookupPrefix("book");
CError.Compare(s, null, "Error in root element");
writer.WriteEndElement();

出力

<root xmlns="book">
  <x:node xmlns:x="author" /> 
</root>

AddNamespace メソッドを使用して名前空間を追加し、PushScope メソッドと PopScope メソッドを使用して固有のスコープを指定する方法を次の例に示します。

Public Sub Main()
        Dim nametable As NameTable = New NameTable()
        Dim nsm As XmlNamespaceManager = New XmlNamespaceManager(nametable)
        ' Add a default namespace.
        nsm.AddNamespace(String.Empty, "www.microsoft.com")
        nsm.AddNamespace("msbooks", "www.microsoft.com/books")
        'Push the namespace scope on the stack.
        nsm.PushScope()
        nsm.AddNamespace("msstore", "www.microsoft.com/store")
        checkns(nsm)
        nsm.PopScope()
        checkns(nsm)

        Dim response As String = Console.ReadLine

End Sub

Public Sub checkns(ByVal nsm As XmlNamespaceManager)
        If nsm.HasNamespace(String.Empty) Then
            Console.WriteLine("DefaultNamespace in scope")
        Else
            Console.WriteLine("DefaultNamespace not in scope")
        End If
        If nsm.HasNamespace("msstore") Then
            Console.WriteLine("www.microsoft.com/store"" in scope")
        Else
            Console.WriteLine("www.microsoft.com/store not in scope")
        End If
        If nsm.HasNamespace("msbooks") Then
            Console.WriteLine("www.microsoft.com/books in scope")
        Else
            Console.WriteLine("www.microsoft.com/books not in scope")
        End If
End Sub
[C#]
XmlNameTable nt = new XmlNameTable();
XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
//Add a default namespace.
nsmanager.AddNamespace (String.Empty, "www.microsoft.com"); 
nsmanager.AddNamespace ("msbooks", "www.microsoft.com/books");
nsmanager.PushScope();
nsmanager.AddNamespace ("msstore", "www.microsoft.com/store");
checkns(nsmanager);
nsmanager.PopScope();
checkns(nsmanager);

checkns(XmlNamespaceManager nsm)
{
    if (nsm.HasNamespace(String.Empty))
        Console.WriteLine("DefaultNamespace in scope");
    else
        Console.WriteLine("DefaultNamespace not in scope");
    if (nsm.HasNamespace("msstore"))
        Console.WriteLine(""www.microsoft.com/store"" in scope");
    else
        Console.WriteLine(""www.microsoft.com/store"" not in scope");
    if (nsm.HasNamespace("msbooks"))
        Console.WriteLine(""www.microsoft.com/books"" in scope");
    else
        Console.WriteLine(""www.microsoft.com/books"" not in scope");
}

出力

DefaultNamespace not in scope
www.microsoft.com/store" in scope
www.microsoft.com/books not in scope
DefaultNamespace in scope
www.microsoft.com/store not in scope
www.microsoft.com/books in scope

現在のスコープ内のすべてのプリフィックスを列挙し、追加の 3 つの名前空間とプリフィックスのペアを一覧する例を次に示します。これら 3 つの既定の名前空間とプリフィックスのペアは、名前空間マネージャの作成時に自動的に追加されます。

Dim nametable As NameTable = New NameTable()
Dim nsm As XmlNamespaceManager = New XmlNamespaceManager(nametable)
'Add a default namespace.
nsm.AddNamespace("xmlabc", "www.microsoft.com")
Dim prefix As String
For Each prefix In nsm
    Console.WriteLine("Namespace:{0}, Prefix:{1}", nsm.LookupNamespace(nsm.NameTable.Get(prefix)), prefix)
Next
[C#]
NameTable nametable = new NameTable();
XmlNamespaceManager nsm = new XmlNamespaceManager(nametable);
//Add a default namespace.
nsm.AddNamespace("xmlabc", "www.microsoft.com"); 
foreach (String prefix in nsm)
    {
        Console.WriteLine("Namespace:{0}, Prefix:{1}",nsm.LookupNamespace(nsm.NameTable.Get(prefix)), prefix);
    }

出力

Namespace:http://www.w3.org/XML/1998/namespace, Prefix:xml
Namespace:http://www.w3.org/2000/xmlns/, Prefix:xmlns 
Namespace:, Prefix: 
Namespace:www.microsoft.com, Prefix:xmlabc

参照

XML ドキュメントにおける名前空間 | 名前空間の宣言 | 既定の名前空間 | 名前空間の宣言のスコープ | XmlNamespaceManager を使用した名前空間の管理