Gerenciando namespaces em um documento XML

Namespaces XML e nomes de elementos e atributos em um documento XML com o URIs personalizado e predefinido. Para criar essas associações, você define prefixos para URIs de namespace e usa os prefixos para qualificar nomes de atributo e elemento nos dados XML. Namespaces impedem conflitos de nomes de elementos e atributos e permitem que elementos e atributos de mesmo nome sejam tratados e validados de maneira diferente.

Declaração de namespaces

Para declarar um namespace em um elemento, você usa o atributo xmlns::

xmlns:<name>=<"uri">

em que <name> é o prefixo de namespace e <"uri"> é o URI que identifica o namespace. Após declarar o prefixo, você pode usá-lo para qualificar os elementos e atributos em um documento XML e associá-los ao URI de namespace. Porque o prefixo de namespace é usado em todo um documento, deve ser curto de tamanho.

Este exemplo define dois elementos BOOK. O primeiro elemento é qualificado pelo prefixo, mybook, e o segundo elemento é qualificado pelo prefixo, bb. Cada prefixo está associado a um URI de namespace diferente:

<mybook:BOOK xmlns:mybook="http://www.contoso.com/books.dtd">  
    <bb:BOOK xmlns:bb="urn:blueyonderairlines" />
</mybook:BOOK>

Para indicar que um elemento é uma parte de um namespace específico, adicione o prefixo de namespace a ele. Por exemplo, se um elemento Author pertence ao namespace mybook, ele é declarado como <mybook:Author>.

Escopo de declaração

Um namespace é efetivo do ponto de declaração até o fim do elemento em que foi declarado. Neste exemplo, o namespace definido no elemento BOOK não se aplica a elementos fora do elemento BOOK, como o elemento Publisher:

<Author>Joe Smith</Author>  
<BOOK xmlns:book="http://www.contoso.com">  
    <title>My Wonderful Day</title>  
      <price>$3.95</price>  
</BOOK>  
<Publisher>  
    <Name>MSPress</Name>  
</Publisher>  

Um namespace deve ser declarado para poder ser usado, mas não precisa aparecer na parte superior do documento XML.

Ao usar vários namespaces em um documento XML, você pode definir um namespace como o namespace padrão para criar um documento com aparência mais clara. O namespace padrão é declarado no elemento raiz e se aplica a todos os elementos não qualificados no documento. Namespaces padrão se aplicam apenas a elementos, não a atributos.

Para usar o namespace padrão, omita o prefixo e os dois-pontos da declaração no elemento:

<BOOK xmlns="http://www.contoso.com/books.dtd">  
...
</BOOK>

Gerenciando namespaces

A classe XmlNamespaceManager armazena uma coleção de URIs de namespace e seus prefixos e permite que você veja, adicione e remova namespaces dessa coleção. Em determinados contextos, essa classe é necessária para fornecer melhor desempenho de processamento de XML. Por exemplo, a classe XsltContext usa XmlNamespaceManager para suporte a XPath.

O gerenciador de namespace não executa nenhuma validação nos namespaces, mas presume que namespaces e prefixos já tenham sido verificados e estejam de acordo com a especificação Namespaces do W3C.

Observação

LINQ TO XML no C# e Visual Basic não usam XmlNamespaceManager para gerenciar namespaces. Confira Trabalhando com namespaces de XML(C#) e Trabalhando com namespaces de XML (Visual Basic) na documentação do LINQ para obter informações sobre como gerenciar namespaces ao usar o LINQ to XML.

Aqui estão algumas das tarefas de gerenciamento e de pesquisa podem ser executadas com a classe XmlNamespaceManager. Para saber mais e exemplos, siga os links para a página de referência para cada método ou propriedade.

Para Uso
Adicionar um namespace Método AddNamespace
Remover um namespace Método RemoveNamespace
Localizar o URI do namespace padrão Propriedade DefaultNamespace
Localizar o URI para um prefixo de namespace Método LookupNamespace
Localizar o prefixo para um URI de namespace Método LookupPrefix
Obter uma lista de namespaces do nó atual Método GetNamespacesInScope
Definir o escopo de um namespace Métodos PushScope e PopScope
Verificar se um prefixo é definido no escopo atual Método HasNamespace
Obter a tabela de nomes usada para pesquisar URIs e prefixos Propriedade NameTable

Confira também