从 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 中的前缀:

Dim prefix As String = nsMgr.LookupPrefix("urn:samples")
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
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()
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 方法添加命名空间,以及如何使用 PushScopePopScope 方法限定它的范围。

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
 
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

下面的示例枚举当前范围内的所有前缀,并列出附加的三个命名空间和前缀对。 创建时这三个默认命名空间和前缀对自动添加到命名空间管理器。

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
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 管理命名空间