Eu vi a seguinte linha em um arquivo XML:
xmlns:android="http://schemas.android.com/apk/res/android"
Também vi xmlns
em muitos outros arquivos XML que me deparei.
O que é isso?
Eu vi a seguinte linha em um arquivo XML:
xmlns:android="http://schemas.android.com/apk/res/android"
Também vi xmlns
em muitos outros arquivos XML que me deparei.
O que é isso?
Respostas:
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/
<LinearLayout
funciona sem prefixo?
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 name
elementos, 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 name
significado 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 personxml
e os mycityxml
dois 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 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 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>
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.
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 node
elementos diferentes em um arquivo xml. Sem espaços para nome, esse arquivo não seria válido.
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.