Pergunta

Isso é algo que eu sempre encontrar um pouco difícil de explicar aos outros: Por que existem namespaces XML? Quando devemos usá-los e quando não deveríamos? Quais são as armadilhas comuns ao trabalhar com namespaces em XML?

Além disso, como eles se relacionam com esquemas XML? Should esquemas XSD ser sempre associado a um namespace?

Foi útil?

Solução

Eles são para permitir que várias linguagens de marcação para ser combinados, sem ter que se preocupar com conflitos de nomes de elementos e atributos.

Por exemplo, olhar para qualquer pedaço de código XSLT, e depois pensar o que aconteceria se você não usar namespaces e estava tentando escrever um XSLT onde a saída tem de conter "template", "for-each", etc, elementos. Os erros de sintaxe, é o que.

Vou deixar o conselho e armadilhas para os outros com mais experiência do que eu.

Outras dicas

Por que existem namespaces XML?

Porque, em 1997, algumas pessoas muito influentes no W3C queria que eles, e não seria nenhum exame para uma resposta. Mesmo quando foi demonstrado, ouso dizer conclusivamente, que havia melhores maneiras de resolver o "problema" que eles pensavam que tinham, eles ainda exercia a sua influência para ter seus desejos escrito em uma Recomendação W3C.

A maior whopper no agora extensa mitologia em torno XML Namespaces é que não há mérito técnico para eles. (Este é o efeito a jusante de uma recomendação simplesmente existente e ocupando assim mindspace - "Pô, tem de haver uma (boa) razão!." - ao contrário de um algum lugar nota forgetable)

Muita dor, sem ganho .

Quando devemos usá-los e quando não deveríamos?

Você nunca deve usá-los se você pode ajudá-lo. Infelizmente, a promoção implacável deste BAD [*] dispositivo pelas partes interessadas tem fomentado um Clusterf * ck de especificações hoje que tornam praticamente impossível não ter de lidar com namespaces XML em algum ponto ou outro. Assim, mesmo se você eschew XML namespaces você mesmo, você vai encontrar crud incrustado de namespace vindo em você de todas as direções, ou pior, conjuntos de ferramentas que simplesmente se recusam a trabalhar a menos que você alimentá-los, tais crud.

Quais são as armadilhas comuns ao trabalhar com namespaces em XML?

Uma armadilha muito comum é no uso de expressões XPath com documentos onde um espaço de nomes tem sido "inadimplentes": o namespace terá que ser explícito nas expressões. Outra questão é usá-los "corretamente" ao construir documentos: eles criam problemas fora do fino ar.

Além disso, como eles se relacionam com esquemas XML? Should esquemas XSD ser sempre associado a um namespace?

Não há nenhuma relação necessária, exceto que o esquema XSD especificação foi desenvolvida numa época em que quase todo mundo no comitê teve o XML Namespaces mordeu em seus dentes. Então eles trabalharam lo em tão profundamente quanto podiam. É possível, no entanto, usar esquemas XSD sem namespaces, mas é um trabalho árduo subida íngreme como apenas sobre cada conjunto de ferramentas de apoio esquemas XSD assume que você vai ser "querer" namespaces de uso.

[*] BAD = quebrado como projetado

UPDATE: Um ensaio de idade neste não-solução para um não-problema .

É quase o mesmo que perguntar "por que usar pacotes para Java / C #?":

  • reutilização :. Você pode reutilizar um conjunto de tags / atributos que definem através de diferentes tipos de documentos XML
  • modularidade : Se você precisa adicionar algum "aspecto" para o seu XML; a adição de um espaço de nomes para o seu documento XML é mais simples do que mudar a sua definição de esquema xml inteiro.
  • Evite poluir o "principal" namespace :. Você não forçar seu analisador para trabalhar com uma definição de esquema enorme, é só usar o namespace que você precisa

A maior IMHO armadilha é humano-interacção interpretação de documentos, por exemplo, para desenvolver o código para processar um documento XML. É muito fácil de se concentrar sobre a expressão literal do documento e não o resultado infoset de analisar o documento.

por exemplo. os seguintes nós

<a xmlns="uri:foo"/>
<foo:a xmlns:foo="uri:foo"/>
<bar:a xmlns:bar="uri:foo"/>

são semanticamente idênticas - ainda muito diferentes para o olho ingênuo

.

A 1ª exemplo produz um XPaths muito erro comum em desenvolvimento - faltando o fato de que "a" é um espaço de nomes - assim // um rendimento sem resultados. (Ou pior ainda nós em um namespace diferente de harmonização!)

A 3ª exemplo abre outra falha na compreensão - de que o texto de prefixo é semanticamente significativa. Ao analisar documentos com o XPath posso declarar qualquer prefixo I como para a correspondência, desde que ele é uri corresponde aqueles do documento.

Pense neles como apelidos para tipos de elementos. Se você tem dois amigos, ambos chamado Bob, e você está falando de um deles, alguém pode perguntar o que Bob que você está falando. Basta dizer "Bob" não é muito útil, então você diz "Bob Smith", ou "Bob Jones".

É o mesmo com tipos de elemento. Às vezes, um nome curto não é suficiente, porque as pessoas diferentes podem escolher o mesmo nome. Então você incluir um URI como um "sobrenome", para distinguir entre os diferentes Bobs lá fora.

XML é um super-linguagem, o que significa que é a base para qualquer linguagem baseada em XML (faz sentido, certo?). Pense em XML como uma caneta que pode escrever qualquer frase, em qualquer idioma. Tudo depende do escritor, e de preferência a linguagem deve ser conhecido para o leitor.

Um XML namespace é basicamente o nome da língua, bem como "Inglês" ou "?????". I ajuda o destinatário do documento XML para analisá-lo e extrair as informações dentro.

Vamos dizer que eu tenho uma fábrica de móveis e você tem uma loja de móveis. o seu pedido de armazenagem e meu pedido de fornecimento são completamente alheios, mas quando eles se comunicam através de mensagens XML, as mensagens devem ser compreensíveis e facilmente analisado por ambos os lados

Portanto, ambos os sistemas precisa saber o Esquema , que define a sintaxe da linguagem e restrições acordadas. Pense no esquema como o livro do dicionário e gramática. O esquema é o documento que ambos os sistemas deve saber, que quem escreve o código de análise em cada sistema deve saber, e isso inclui a declaração do espaço de nomes.

Cada namespace é nomeado como um URI, que na maioria dos casos é a localização do documento de esquema que o define.

É claro, nem todos os documentos XML precisa de um espaço de nomes, especialmente quando não é utilizado para transmitir informações para um sistema remoto. Por exemplo, quando você serializar objetos em XML para persistir em seu banco de dados.

Nós usamos namespaces porque as pessoas xeep querendo usar as mesmas palavras para significar coisas diferentes em seu Own Private Idaho. Normalmente, você pode determinar a partir do contexto que uma pessoa meios. Em um banco de dados pessoal, o XML é registros de pessoal. Em um banco de dados de registro de veículos, o XML é registros de registro de veículos.

Ambos manter um tag com o nome "localização", mas os meios de tag coisas diferentes para cada um e contém campos diferentes.

Agora, isso é legal, mas o que se você precisa ou deseja armazenar XML de ambos no mesmo banco de dados? Ou, mais interessante, o que se ambos os bancos de dados quer pedaços loja XML a partir de algum outro, banco de dados comum (por exemplo: um banco de dados de contas).

namespaces XML associados com cada tag XML um URI, de tal forma que o próprio nome da marca tem uma url na frente dele, isso é parte do nome da marca (claro, documentos XML reais usar um atalho faça isso!). Ao escolher cuidadosamente o URI, é fácil estar confiante de que os nomes de marca não vai colidir - é como se as duas etiquetas de localização foram nomeados de forma inteiramente diferente, por isso não há confusão. Como um bônus, os dois inteiramente diferentes etiquetas de localização pode incluir material do banco de dados de contas, e explicitamente estado que eles estão falando sobre a mesma coisa.

O que torna tudo isso útil é XPATH.

Com o acima, você pode começar a expressões XPATH gravação que dizem coisas como: encontrar-me quaisquer seções accounts:account overdue em qualquer lugar neste xml. Ou:. Encontrar-me nenhum item accounts:warning message em qualquer lugar neste pedaço particular de XML, onde a mensagem de aviso é um nó filho (no entanto profundidade) de um nó personnel:payment ou um nó vehicle:status

Essa expressão XPath pode estar em algum lugar usado em um documento XSLT, cuja função é converter o XML em XHTML ou XPDF, para exibição.

O que é a recompensa? Por que fazê-lo? Porque você pode pesquisar o arquivo de log XML, retire todas as contas de mensagens vencidas onde quer que eles aparecem, sem confundi-los com tags "mensagem" produzidos por outros sistemas , convertido 'em para xhtml, e exibi-los em negrito vermelho através de um tag css:. tudo sem escrever um pedaço de código processual

Por exemplo: XML Namespaces por Exemplo

Em minhas palavras: Se você deve usar algum formato XML para empresa externa (por exemplo) e você precisa fornecer no documento XML algumas informações, que tem o mesmo nome, você precisa de um espaço de nomes. Exemplo:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="Blue"/>
      </items>
   </header>
</sampleDoc>

e você quer mesclar alguns dados a este documento, que tem um mesmo nome, mas um outro sentido (assim valor a), você deve usar um espaço de nomes:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="White" my_unique_namespace:color="#FFFFFF"/>
      </items>
   </header>
</sampleDoc>

Claro - você pode alterar um nome de atributo. Por exemplo, para "my_unique_color". Bud em outro documento, não pode haver atributo com mesmo nome novamente. Então, se você tem um namespace exclusivo (nosso domínio web, por exemplo), você sempre pode usar os mesmos nomes de elementos e / ou atributos withoud quaisquer problemas.

A partir da W3 recomendação ...

namespaces XML fornecem um método simples para qualificar nomes de elementos e atributos utilizados em documentos Extensible Markup Language, associando-as com namespaces identificados por referências URI.

Namespaces são usados ??para nomes disambiguate que você usar no documento. Ele também lhe dá a capacidade de se ligar um nome curto para um espaço de nome que pode então ser usado para se referir a um elemento remoto ou atributo. O espaço próprio nome refere-se à localização que define os elementos e atributos que você usar no documento. Há muito mais para saber, mas isso é o coração dela. Há muito mais informações aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top