O que significa "xmlns" em XML?


415

Eu vi a seguinte linha em um arquivo XML:

xmlns:android="http://schemas.android.com/apk/res/android"

Também vi xmlnsem muitos outros arquivos XML que me deparei.

O que é isso?




Agora você também deve saber por que obtemos erros no xml quando usamos as tags incorretamente ou no lugar errado. :)
Vaibs 23/08/19

Respostas:


299

Ele define um espaço para nome XML .

No seu exemplo, o Prefixo do namespace é " android " e o URI do namespace é " http://schemas.android.com/apk/res/android "

No documento, você vê elementos como: <android:foo />

Pense no prefixo do espaço para nome como uma variável com um alias de nome abreviado para o URI do espaço para nome completo. É o equivalente a escrever <http://schemas.android.com/apk/res/android:foo />com relação ao que "significa" quando um analisador XML lê o documento.

NOTA: Na verdade, você não pode usar o URI do espaço para nome completo no lugar do prefixo do espaço para nome em um documento de instância XML.

Confira este tutorial em namespaces: http://www.sitepoint.com/xml-namespaces-explained/


62
Eu sempre colo esses URIs em um navegador da Web apenas para ver o que o analisador está vendo, mas sempre retorna 404. Supõe-se que seja um URI real que precisa de um nome de arquivo padrão anexado até o final ou é apenas uma técnica por criar um ID único?
Patrick Patrick

36
@ Patrick sim, é apenas um URI que precisa ser exclusivo para indicar que é um espaço de nome separado dos outros e, portanto, quaisquer tags duplicadas em potencial serão interpretadas corretamente. Portanto, o URI geralmente não aponta para nada.
Foochow

3
Hmm ... bom saber que é um espaço para nome. Eu costumava me perguntar se a especificação de um URI fez com que a página html realmente acessasse esse site para determinar um esquema.
Nav

17
@ Patrick, URI não é o mesmo que URL. Um URL é um localizador e um URI é apenas um identificador. Você pode muito bem escolher um GUID como um URI. De fato, o ISBN que temos para livros é uma forma de URI.
precisa saber é o seguinte

então como as tags funcionam? Quero dizer, <LinearLayoutfunciona sem prefixo?
Asif Mushtaq

676

Isso significa espaço para nome XML .

Basicamente, todo elemento (ou atributo) no XML pertence a um espaço para nome, uma maneira de "qualificar" o nome do elemento.

Imagine que você e eu inventamos nosso próprio XML. Você inventa XML para descrever pessoas, eu inveno o meu para descrever cidades. Nós dois incluímos um elemento chamado name. O seu refere-se ao nome da pessoa e o meu ao nome da cidade - OK, é um pouco artificial.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Se nossos dois XMLs fossem combinados em um único documento, como distinguiríamos os dois nomes? Como você pode ver acima, existem dois nameelementos, mas ambos têm significados diferentes.

A resposta é que você e eu atribuímos um namespace ao nosso XML, que tornaríamos únicos:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Agora que qualificamos totalmente nosso XML, não há ambiguidade quanto ao namesignificado de cada elemento. Todas as tags que começam com personxml:pertencem ao seu XML, todas as que começam com cityxml:são minhas.

Há alguns pontos a serem observados:

  • Se você excluir quaisquer declarações de espaço para nome, as coisas serão consideradas no espaço para nome padrão.

  • Se você declarar um namespace sem o identificador, isto é, xmlns="http://somenamespace"em vez de xmlns:rob="somenamespace", ele especifica o namespace padrão para o documento.

  • O próprio espaço para nome em si, geralmente um IRI , não tem conseqüências reais. Deve ser único, para que as pessoas tendam a escolher uma IRI / URI que possuem, mas não tem um significado maior que isso. Às vezes, as pessoas colocam o esquema (definição) para o XML no IRI especificado, mas isso é uma convenção apenas para algumas pessoas.

  • O prefixo também não tem importância. A única coisa que importa é em qual namespace o prefixo é definido. Várias tags que começam com prefixos diferentes, todas mapeadas para o mesmo espaço para nome são consideradas iguais.

    Por exemplo, se os prefixos personxmle os mycityxmldois foram mapeados para o mesmo espaço para nome (como no trecho de código abaixo), não importaria se você prefixasse um determinado elemento com personxmlou mycityxml, ambos seriam tratados como a mesma coisa por um analisador XML . O ponto é que um analisador XML não se importa com o que você escolheu como prefixo, apenas com o namespace que ele mapeia. O prefixo é apenas um indireto apontando para o espaço para nome.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Os atributos podem ser qualificados, mas geralmente não são. Eles também não herdam seu espaço de nome do elemento em que estão, ao contrário dos elementos (veja abaixo).

Além disso, os espaços para nome do elemento são herdados do elemento pai. Em outras palavras, eu poderia igualmente escrever o XML acima como

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

13
+1 boa e útil resposta conceitual. Você pode qualificar "Basicamente, todo elemento (ou atributo) no xml pertence a um espaço para nome", pois alguns elementos e atributos são considerados "sem espaço para nome". Embora eu entenda que você estava dando o básico.
LarsH 18/08/11

1
@Rob Levine "Os atributos podem ter espaço para nome, mas geralmente não." E o Android?
Paul Brewczynski

1
Então, como é usado, por exemplo, " your.example.com/xml/person "? Ok, eu tenho uma tag <person: name>, e agora? Você pode explicar isso também, por favor?
Koray Tugay

1
@WORMSS - Sim - você está certo. Ao definir sua consulta, você precisa especificar o espaço para nome, provavelmente por meio de um prefixo. No mundo C # System.Xml, por exemplo, você registraria um prefixo no gerenciador de namespace usando XmlNamespaceManager.AddNamespace e, em seguida, use esse prefixo na sua consulta. O fato de o prefixo não aparecer no documento não importa - apenas o namespace que ele mapeia.
Rob Levine

2
Este link de documento da Microsoft: " msdn.microsoft.com/en-us/library/aa468565.aspx " explica muito bem o espaço para nome no XML.
Deen John

16

Acho que a maior confusão é que o espaço para nome xml está apontando para algum tipo de URL que não possui nenhuma informação. Mas a verdade é que a pessoa que inventou abaixo do espaço para nome:

xmlns:android="http://schemas.android.com/apk/res/android"

também poderia chamá-lo assim:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Este é apenas um identificador exclusivo. No entanto, está estabelecido que você deve colocar um URL exclusivo e potencialmente apontar para a especificação de tags / atributos usados ​​nesse espaço para nome. Não é necessário tho.

Por que deveria ser único? Como o objetivo dos espaços para nome é torná-los exclusivos, para que o atributo, por exemplo, chamado segundo plano do seu espaço para nome, possa ser diferenciado do segundo plano de outro espaço para nome.

Por causa dessa singularidade, você não precisa se preocupar que, se você criar seu atributo personalizado, terá colisão de nomes.


Oi Morfidon. Por favor, você poderia adicionar na sua resposta um link para uma referência especificando que o conteúdo ou o URL pode ser qualquer coisa? O que deve ser único? Também esclareça a exclusividade: O nome do espaço para nome XML ou o conteúdo do URL? Cheers
olibre

@olibre Se você quiser usar o namespace do android, use o nome deles. Esse é o nome único deles. Eles decidiram colocar lá um URL. Se você estiver criando seu próprio espaço para nome, poderá chamá-lo como quiser, apenas certifique-se de que seja único. Dizem que você deve usar a URL que aponta para o local em que descreve o que está dentro desse espaço para nome, mas como você pode ver, mesmo os criadores do espaço para nome Android não fizeram isso.
Morfidon 11/07

Obrigado Morfidon. Finalmente entendi esse ponto ao ler a resposta do Rob . Gosto da sua resposta, pois destaca um aspecto importante que não é bem conhecido. Mas tente melhorar sua resposta, esclareça qual parte deve ser única, forneça referências, reformule, verifique as palavras ... Alguns leitores podem ficar confusos com sua resposta atual. Cheers
olibre

1
Esta é a resposta que eu precisava! Tão confuso usar um URI para esse valor de atributo, porque as pessoas pensam em URI = URL e esperam que algum documento deva residir no local. Mas o AFAICT não tem problema se o URI retornar um 404. É apenas um identificador exclusivo que parece um endereço. Pode haver alguns validadores especiais que esperam encontrar um esquema ou uma DTD nesse local (o que faria sentido), mas esses são casos especiais, eu acho. Por favor, corrija-me se eu estiver errado aqui.
Brennanyoung

1
@brennanyoung é exatamente como você disse :)
Morfidon

12

xmlns - espaço para nome xml. É apenas um método para evitar conflitos de nome de elemento. Por exemplo:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Dois nodeelementos diferentes em um arquivo xml. Sem espaços para nome, esse arquivo não seria válido.


4

Você tem espaços de nome para poder ter elementos globalmente exclusivos. No entanto, 99% do tempo isso realmente não importa, mas quando você o coloca na perspectiva da Web Semântica , ele começa a se tornar importante.

Por exemplo, você pode fazer um mash-XML de diferentes esquemas usando o apropriado xmlns. Por exemplo, mash up amigo de um amigo com vCard , etc.


para xml trivial, isso pode ser ignorado, pois todos os demais namespaces são extremamente importantes. + Eu realmente não vejo a conexão entre a web semântica e o espaço para nome. A web semântica é um conceito, o namespace faz parte do padrão XML, você está misturando a definição da interface e os detalhes da implementação.
Newtopian 28/09/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.