Поделиться через


Управление пространствами имен с помощью XmlNamespaceManager

Класс XmlNamespaceManager содержит коллекцию URI-кодов пространств имен и их префиксов. Он позволяет разрешать пространства имен, добавлять их в коллекцию и удалять из коллекции. В некоторых контекстах он необходим для повышения производительности обработки XML. Например, класс XmlNamespaceManager используется классом XsltContext для обеспечения поддержки XPath. Дополнительные сведения о классе XsltContext см. в статье базы знаний Майкрософт Q324899 Как реализовать и использовать пользовательские функции расширения при выполнении запросов XPath Queries в Visual Basic .NET.

Тот же образец на языке C# см. в статье базы знаний Майкрософт Q324462 Как реализовать и использовать пользовательские функции расширения при выполнении запросов XPath в Visual C# .NET.

ПримечаниеПримечание

Если используется язык 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. Во время создания диспетчера пространств имен можно использовать свойство NameTable из классов XmlTextReader, XsltContext или XmlDocument. Пользовательский объект XmlNamespaceManager создается и заполняется нужными декларациями пространств имен с помощью метода AddNamespace. Объект XmlNamespaceManager передается в качестве параметра методам SelectNodes или SelectSingleNode класса XmlDocument, чтобы выполнить выражения запросов 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")
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");

Пример

В следующем примере кода показано, как затем найти это пространство имен с помощью метода LookupNamespace:

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

Более сложный образец добавления и возвращения пространств имен можно найти в коде метода LookupNamespace.

В следующем примере создается объект XmlNamespaceManager, используя свойство NameTable из модуля чтения.

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-документе