使用 XmlNamespaceManager 管理命名空间

XmlNamespaceManager 类包含命名空间 URI 及其前缀的集合。 它允许您解析、添加和移除集合中的命名空间。 某些上下文需要此类以提高 XML 处理性能。 例如,XsltContext 类使用 XmlNamespaceManager 以支持 XPath。 有关 XsltContext 类的更多信息,请参见 Microsoft 知识库文章 Q324899 HOW TO: Implement and Use Custom Extension Functions When You Execute XPath Queries in Visual Basic .NET(如何:在 Visual Basic .NET 中执行 XPath 查询时实现和使用自定义扩展函数)。

有关 C# 语言的同一示例,请参见 Microsoft 知识库文章 Q324462 HOW TO: Implement and Use Custom Extension Functions When You Execute XPath Queries in Visual C# .NET(如何:在 Visual C# .NET 中执行 XPath 查询时实现和使用自定义扩展函数)。

注意注意

如果您要使用 LINQ to XML,则不能使用 XmlNamespaceManager 来管理命名空间。有关使用 LINQ to XML 时如何管理命名空间的信息,请参见使用 XML 命名空间

命名空间

创建命名空间管理器后,将自动向该类添加三个前缀。 下表列出了这三个前缀及其表示的命名空间。

前缀

命名空间

xmlns

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

xml

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

String.Empty

空命名空间。 该值可以分配给一个前缀。 例如, 将默认命名空间定义为空命名空间。

若要向命名空间管理器添加命名空间,请先创建一个命名空间管理器,然后使用 AddNamespace 方法。 在创建命名空间管理器时,可以使用 XmlTextReaderXsltContextXmlDocument 类中的 NameTable。 使用 AddNamespace 方法可创建自定义 XmlNamespaceManager 对象并用适当的命名空间声明进行填充。 提供的 XmlNamespaceManager 作为 XmlDocument 类的 SelectNodesSelectSingleNode 方法的参数,可执行引用命名空间限定的元素和属性名称的 XPath 查询表达式。 添加命名空间时做下列假定:

  • 前缀和命名空间已经过验证并符合 W3C 命名空间规范。 命名空间管理器不对命名空间执行任何验证。

  • 在使用 AddNamespace 方法添加字符串时,命名空间管理器将会原子化这些字符串。

  • 在使用 LookupNamespaceLookupPrefix 方法执行查找时,命名空间管理器将会原子化字符串。

  • 创建时默认前缀和命名空间对自动添加到命名空间管理器。

命名空间管理器除了添加和检索命名空间外,还实现枚举支持。 可以使用 foreach 构造遍历命名空间管理器中保存的信息。 假定创建了一个名为 nsmanager 的命名空间管理器,可以使用 foreach (String prefix in nsmanager) 循环访问表。

由于命名空间管理器提供将前缀和命名空间作为对象的字符串比较功能,因此与字符串的直接比较相比,使用命名空间管理器可以提高性能。

若要向命名空间管理器中添加命名空间,请使用 AddNamespace 方法。 下面的代码示例显示了如何将前缀 xsd 与 http://www.w3.org/2001/XMLSchema 这一命名空间 URI 绑定在一起。

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 文档中的命名空间