Em adição a este documento, veja Intensivo de Namespaces.

Namespaces em XML fornecem uma forma de distinguir elementos duplicados e nomes de atributos. Elementos duplicados e nomes de atributos podem ocorrer quando um documento XML contêm elementos de dois ou mais esquemas XML (ou DTDs, Definição de Tipo de Documento). Citando a Wikipedia:  "Em geral, um namespace é um recipiente abstrato fornecendo contexto para os itens ... detém e permite desambiguação de itens que tem o mesmo nome."

Se você se sente familiar com namespaces em C++, pacotes Java, pacotes Perl, ou módulo de importação em Python, você já é familiar com o conceito de namespace.

Um namespace é identificado por um nome únco (chamado de URI, não uma URL, apesar de poder parecer com uma URL). Um URI é qualquer string, apesar de que a maioria das pessoas escolhem um URI baseado em uma URL pois URLs são uma forma fácil de esperar por singularidade. Apesarde que não há nada prevenindo alguém de usar o namespace http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul, é bastante improvável que alguém iria escolhê-lo acidentalmente. Mesmo se alguém acidentalmente o escolhe, pode talvez não definir os mesmos elementos como XUL de qualquer forma (e.g., <textbox/>) em seu esquema/DTD.

Qualquer tipo de elemento ou nome de elemento em um namespace XML pode ser identificado por seu namespace XML e seu "nome local". Juntos, estes dois definem um nome qualificado, ou QName.

Por exemplo, <xul:textbox/> usa um namespace chamado "xul" e um nome local "textbox". Isto o distingue de, por exemplo, <foobar:textbox/> que pode ocorrer no mesmo documento. Os namespaces xul e foobar devem ser definidos no topo do documento XML em que estão sendo usados, como:

 <foobar:algum-elemento 
     xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
     xmlns:foobar="o-namespace-foobar">
   <xul:textbox id="foo" value="bar"/>
   <foobar:textbox comida-favorita="pizza"/>
 </foobar:algum-elemento>

Note que misturei dois <textbox/> no mesmo documento. A única forma de distinguir que eles tem significados diferentes é com namespaces.

Há mais uma outra coisa a saber: "namespace padrão", e é usado com elementos XUL por todo o tempo. Em documentos XUL, você normalmente vê isto:

 <window
     id="foo"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   ...
   ...
 </window>

e documentos XHTML você vê isto:

 <html xmlns="http://www.w3.org/1999/xhtml">
   ...
   ...
 </html>

Há uma diferença muito sutil aqui em comparação com o anterior. Antes eu escrevi xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" mas aqui a peça :xul é omitida. Isto mostra ao analisador XML que http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xulé o namespace padrão para o elemento e seus elementos descendentes (até que seja substituído posteriormente por um namespace padrão em um elemento descendente), e que qualquer elemento sem um namespace (ex.: sem prefixo e vírgula) pertence ao namespace padrão. Por isto que podemos escrever de forma abreviada <textbox/> ao invés de <xul:textbox/> em XUL (embora o último é tão correcto quando não usamos http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul como namespace padrão) -- o namespace XUL é definido como o padrão no elemento mais elevado. Em outras palavras, um namespace padrão permite um tipo de forma abreviada a ser usada por todos os descendentes de um elemento.

Aqui vai uma pergunta: qual namespace contêm o elemento foo no documento XML abaixo?

  <foo/>

A resposta é que é em nenhum namespace, ou alternadamente, está no namespace denotado pela string vazia:

  <foo xmlns=""/>

Este segundo exemplo é semanticamente equivalente ao primeiro. This second example is semantically equivalent to the first.

Agora, uma segunda pergunta: em quais namespaces estão os atributos bar, baz e quux?

  <foo bar="value">
    <element xmlns="namespace!" baz="value">
      <element quux="value"/>
    </element>
  </foo>

bar não é, obviamente, um namespace. E baz e quux? A resposta é que eles não são um namespace também. Na verdade nenhum atributo não pré-fixado é um namespace, principalmente porque XML originalmente não tinha namespaces, e todos os XML's do tempo tinham que ficar sem namespace. Isto é uma fonte de confusão geral em volta de namespaces em XML.

Etiquetas do documento e colaboradores

Etiquetas: 
 Colaboradores desta página: coloringa
 Última atualização por: coloringa,