it-swarm.dev

O que significa "xmlns" em XML?

Eu vi a seguinte linha em um arquivo XML:

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

Eu também vi xmlns em muitos outros arquivos XML que eu encontrei.

O que é isso?

386
user88637

Define um Namespace 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 namespace como uma variável com um apelido de nome curto para o URI de namespace 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.

NOTE:Você não pode realmente usar o URI de namespace completo no lugar do prefixo de namespace em um documento de instância XML .

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

279
Mads Hansen

Isso significa namespace XML .

Basicamente, todo elemento (ou atributo) em XML pertence a um namespace, uma forma de "qualificar" o nome do elemento.

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

<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 elementos name, mas ambos têm significados diferentes.

A resposta é que você e eu atribuiríamos um namespace ao nosso XML, o que tornamos exclusivo:

<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 nós qualificamos totalmente o nosso XML, não há ambiguidade quanto ao significado de cada elemento name. Todas as tags que começam com personxml: são tags pertencentes ao seu XML, todas as que começam com cityxml: são minhas.

Existem alguns pontos a serem observados:

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

  • Se você declarar um namespace sem o identificador, ou seja, xmlns="http://somenamespace", em vez de xmlns:rob="somenamespace", ele especificará o namespace padrão do documento.

  • O namespace propriamente dito, muitas vezes um IRI , não tem nenhuma consequência real. Deve ser único, por isso as pessoas tendem a escolher uma IRI/URI que possuem, mas não tem um significado maior do que isso. Às vezes, as pessoas colocam o esquema (definição) para o XML no IRI especificado, mas isso é uma convenção de apenas algumas pessoas.

  • O prefixo também não é importante. A única coisa que importa é o espaço de nomes onde o prefixo é definido. Várias tags que começam com prefixos diferentes, todas mapeadas para o mesmo namespace, são consideradas iguais.

    Por exemplo, se os prefixos personxml e mycityxml forem mapeados para o mesmo namespace (como no snippet abaixo), não importaria se você prefixasse um determinado elemento com personxml ou 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 o namespace que ele mapeia também. O prefixo é apenas um indireto apontando para o namespace.

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

Além disso, os namespaces de elemento são herdados do elemento pai. Em outras palavras, eu poderia igualmente ter escrito 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>
640
Rob Levine

xmlns - namespace 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 elementos node diferentes em um arquivo xml. Sem namespaces, esse arquivo não seria válido.

11
Iurii

Eu acho que a maior confusão é que o namespace 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 namespace:

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 único. No entanto, é estabelecido que você deve colocar uma URL que seja única e possa apontar potencialmente para a especificação de tags/atributos usados ​​nesse namespace. Não é necessário tho.

Por que deveria ser único? Como o objetivo dos namespaces é tê-los exclusivos, o atributo, por exemplo, chamado background do seu namespace pode ser distinguido do background de outro namespace.

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

11
Morfidon

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

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

4
Jon

Namespaces XML fornece um método para evitar conflitos de nome de elemento. Em XML, os nomes dos elementos são definidos pelo desenvolvedor. Isso geralmente resulta em um conflito ao tentar misturar documentos XML de diferentes aplicativos XML.

Conflitos de nomes em XML podem ser facilmente evitados usando um prefixo de nome. Ao usar prefixos em XML, um namespace para o prefixo deve ser definido.

O namespace pode ser definido por um atributo xmlns na tag de início de um elemento. A declaração de namespace tem a seguinte sintaxe. xmlns: prefixo = "URI".

0
Neeraj Gahlawat