it-swarm.dev

Devo usar elementos ou atributos em XML?

Estou aprendendo sobre Atributos XML de W3Schools .

O autor menciona o seguinte (ênfase minha):

Elementos XML vs. Atributos

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

No primeiro exemplo, sexo é um atributo. No último, o sexo é um elemento. Ambos os exemplos fornecem a mesma informação.

Não há regras sobre quando usar atributos e quando usar elementos. Atributos são úteis em HTML. Em XML, meu conselho é evitá-los. Use elementos em vez disso.

Evitar atributos XML?

Alguns dos problemas com o uso de atributos são:

  • os atributos não podem conter vários valores (elementos podem)
  • os atributos não podem conter estruturas de árvore (elementos podem)
  • os atributos não são facilmente expansíveis (para futuras alterações)

Atributos são difíceis de ler e manter. Use elementos para dados. Use atributos para informações que não são relevantes para os dados.

Então, a visão do autor é famosa, ou essa é a melhor prática em XML?

Devem ser evitados atributos em XML?

O W3Schools também mencionou o seguinte (ênfase minha):

Atributos XML para Metadados

Às vezes, as referências de ID são atribuídas a elementos. Esses IDs podem ser usados ​​para identificar elementos XML da mesma maneira que o atributo ID em HTML. Este exemplo demonstra isso:

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

O ID acima é apenas um identificador, para identificar as diferentes notas. Não faz parte da nota em si.

O que estou tentando dizer aqui é que metadados (dados sobre dados) devem ser armazenados como atributos, e que os dados em si devem ser armazenados como elementos.

62
Ibn Saeed

O uso de atributos ou elementos é normalmente decidido pelos dados que você está tentando modelar.

Por exemplo, se uma determinada entidade éPARTEdos dados, então é aconselhável torná-la um elemento. Por exemplo, o nome do empregado é uma parte essencial dos dados do empregado.

Agora, se você quiser transmitirMETADADOSsobre dados (algo que fornece informações adicionais sobre os dados), mas não faz parte dos dados, então é melhor torná-los um atributo. Por exemplo, digamos que cada funcionário tenha um GUID necessário para o processamento de back-end, tornando-o um atributo melhor (GUID não é algo que transmita informações realmente úteis para alguém que esteja olhando para o xml, mas pode ser necessário para outros fins)

Não existe uma regra que diga que algo deva ser um atributo ou um elemento.

Não é necessário EVITAR atributos a todo custo. Às vezes eles são mais fáceis de modelar, do que elementos. Isso realmente depende dos dados que você está tentando representar.

53
Prashanth

Não menos importante é que colocar coisas em atributos faz com que o XML seja menos detalhado.

Comparar

<person name="John" age="23" sex="m"/>

Contra

<person>
    <name>
        John
    </name>
    <age>
        <years>
            23
        </years>
    </age>
    <sex>
        m
    </sex>
</person>

Sim, isso foi um pouco tendencioso e exagerado, mas você entendeu

19
flybywire

Meu 0,02 cinco anos após o OP é exatamente o oposto. Deixe-me explicar. 

  1. Use elementos ao agrupar dados semelhantes e atributos de Esses dados. 
  2. Não use elementos para tudo. 
  3. Se os dados se repetem (1 para muitos), é provavelmente um elemento
  4. Se os dados nunca se repetem e só fazem sentido quando correlacionados com Outra coisa, é um atributo.
  5. Se os dados não tiverem outros atributos (ou seja, um nome), então é um atributo
  6. Agrupar elementos semelhantes para suportar a análise de coleção (ou seja,/xml/caractere)
  7. Reutilize nomes de elementos semelhantes para suportar dados de análise 
  8. Nunca, ever , use números em nomes de elementos para mostrar a posição. (isto é, character1, character2) Esta prática torna muito difícil de analisar (ver # 6, código de análise must/character1,/character2, etc. não simplesmente/character.

Considerado de outra maneira:

  • Comece pensando em all seus dados como um atributo.
  • Agrupe os atributos logicamente em elementos. Se você conhece seus dados, raramente precisará converter o atributo em um elemento. Você provavelmente já sabe quando um elemento (coleção ou dados repetidos) é necessário
  • Agrupar elementos juntos logicamente
  • Quando você se deparar com o caso que você precisa para expandir, adicione novos elementos/atributos com base na estrutura lógica de um processo acima. Adicionar uma nova coleção de elementos filho não "quebrará" seu design e será mais fácil de ler com o tempo.

Por exemplo, olhando para uma simples coleção de livros e personagens principais, o título nunca terá "filhos", é um elemento simples. Cada personagem tem um nome e idade.

    <book title='Hitchhiker&apos;s Guide to the Galaxy' author='Douglas Adams'>
        <character name='Zaphod Beeblebrox' age='100'/>
        <character name='Arthur Dent' age='42'/>
        <character name='Ford Prefect' age='182'/>
    </book>

    <book title='On the Road' author='Jack Kerouac'>
        <character name='Dean Moriarty' age='30'/>
        <character name='Old Bull Lee' age='42'/>
        <character name='Sal Paradise' age='42'/>
    </book>

Você poderia argumentar que um livro poderia ter vários autores. OK, basta expandir adicionando novos elementos de autor (opcionalmente, remova o @author original). Claro, você quebrou a estrutura original, mas na prática é muito raro e fácil de contornar. Qualquer consumidor do seu XML original que assumiu um único autor terá que mudar de qualquer maneira (eles provavelmente estão mudando seu banco de dados para mover o autor de uma coluna na tabela 'book' para uma tabela 'author').

<book title='Hitchhiker&apos;s Guide to the Galaxy'>
    <author name='Douglas Adams'/>
    <author name='Some Other Guy'/>
    <character name='Zaphod Beeblebrox' age='100'/>
    <character name='Arthur Dent' age='42'>
    <character name='Ford Prefect' age='182'/>
</book>
18
William Walseth

Eu usei o Google para pesquisar a pergunta exata. Primeiro eu cheguei neste artigo, http://www.ibm.com/developerworks/library/x-eleatt/index.html . No entanto, parecia muito longo para uma pergunta simples como tal. De qualquer forma, eu li todas as respostas sobre este tópico e não encontrei um resumo satisfatório. Como tal, voltei ao último artigo. Aqui está um resumo:

Quando uso elementos e quando uso atributos para apresentar informações?

  • Se a informação em questão puder ser marcada com elementos, coloque-a em um elemento.
  • Se as informações forem adequadas para o formulário de atributo, mas puderem resultar em vários atributos do mesmo nome no mesmo elemento, use elementos filho.
  • Se for necessário que as informações estejam em um tipo de atributo padrão semelhante a DTD, como ID, IDREF ou ENTITY, use um atributo.
  • Se as informações não devem ser normalizadas para espaços em branco, use elementos. ( Processadores XML normalizam atributos de maneiras que podem alterar o texto bruto do valor do atributo.)

Princípio do conteúdo principal

Se você considerar as informações em questão como parte do material essencial Que está sendo expresso ou comunicado no XML, Coloque-o em um elemento. Se você considerar que a informação é periférica Ou incidental à comunicação principal, ou se destina-se apenas a ajudar os aplicativos A processar a comunicação principal, use os atributos.

Princípio da informação estruturada

Se as informações forem expressas de forma estruturada, especialmente se A estrutura puder ser extensível, use elementos. Se a informação for Expressa como um token atômico, use os atributos.

Princípio de legibilidade

Se a informação se destina a ser lida e compreendida por uma pessoa, Use elementos. Se a informação é mais prontamente entendida e Digerida por uma máquina, use atributos.

Princípio da ligação elemento/atributo

Use um elemento se você precisar que seu valor seja modificado por outro atributo . [..] é quase sempre uma ideia terrível ter um atributo modificando o outro.

Este é um breve resumo dos bits importantes do artigo. Se você deseja ver exemplos e descrição completa de cada caso, consulte o artigo original. 

10
Gajus

Mapeamento do modelo de atributos. Um conjunto de atributos em um elemento isomorphizes diretamente em um mapa de nome/valor no qual os valores são texto ou qualquer tipo de valor serializável. Em C #, por exemplo, qualquer objeto Dictionary<string, string> pode ser representado como uma lista de atributos XML e vice-versa.

Este não é enfaticamente o caso dos elementos. Embora você sempre possa transformar um mapa de nome/valor em um conjunto de elementos, o inverso não é o caso, por exemplo:

<map>
   <key1>value</key1>
   <key1>another value</key1>
   <key2>a third value</key2>
</map>

Se você transformar isso em um mapa, perderá duas coisas: os vários valores associados a key1 e o fato de key1 aparecer antes de key2.

O significado disso fica muito mais claro se você observar o código DOM usado para atualizar informações em um formato como este. Por exemplo, é trivial escrever isto:

foreach (string key in map.Keys)
{
   mapElement.SetAttribute(key, map[key]);
}

Esse código é conciso e inequívoco. Compare-o com, digamos:

foreach (string key in map.Keys)
{
   keyElement = mapElement.SelectSingleNode(key);
   if (keyElement == null)
   {
      keyElement = mapElement.OwnerDocument.CreateElement(key);
      mapElement.AppendChild(keyElement);
   }
   keyElement.InnerText = value;
}
5
Robert Rossney

Você não pode colocar um CDATA em um atributo. Na minha experiência, mais cedo ou mais tarde você vai querer colocar aspas simples, aspas duplas e/ou documentos XML inteiros em um "membro", e se for um atributo, você estará amaldiçoando a pessoa que usou os atributos de elementos.

Nota: minha experiência com XML envolveu principalmente a limpeza de outras pessoas. Essas pessoas pareciam seguir o velho ditado "XML é como violência. Se usá-lo não resolveu seu problema, então você não usou o suficiente."

3
Coxy

Tudo depende de qual XML é usado. Quando se trata principalmente de interoperabilidade entre software e máquinas - como serviços da Web, é mais fácil usar todos os elementos apenas para manter a consistência (e também algumas estruturas preferem dessa forma, por exemplo, WCF). Se ele for voltado para o consumo humano - ou seja, principalmente criado e/ou lido por pessoas -, então o uso criterioso de atributos pode melhorar bastante a legibilidade; XHTML é um exemplo razoável disso, e também XSLT e XML Schema.

3
Pavel Minaev

Eu costumo trabalhar com base em atributos que são metadados - ou seja, dados sobre os dados. Uma coisa que evito é colocar listas em atributos. por exemplo. 

attribute="1 2 3 7 20"

Caso contrário, você terá um nível extra de análise para extrair cada elemento. Se o XML fornece a estrutura e as ferramentas para listas, então por que você mesmo impõe outro.

Um cenário em que você pode querer codificar em preferência por atributos é para processamento de velocidade por meio de um analisador SAX. Usando um analisador SAX, você receberá uma chamada de elemento contendo o nome do elemento e a lista de atributos. Se você usou vários elementos em vez disso, receberá vários retornos de chamada (um para cada elemento). Quanto de um fardo/sobrecarga isso é discutido, é claro, mas talvez valha a pena considerar.

3
Brian Agnew

Este é um exemplo em que atributos são dados sobre dados.

Bancos de dados são nomeados pelo seu atributo ID.

O atributo "type" do banco de dados indica o que se espera encontrar dentro da tag do banco de dados.

  <databases>

      <database id='human_resources' type='mysql'>
        <Host>localhost</Host>
        <user>usrhr</user>
        <pass>jobby</pass>
        <name>consol_hr</name>
      </database>

      <database id='products' type='my_bespoke'>
        <filename>/home/anthony/products.adb</filename>
      </database>

  </databases>
2
Anthony Scaife

Os pontos do autor estão corretos (exceto que os atributos podem conter uma lista de valores). A questão é se você se importa ou não com os pontos dele. 

Você decide.

2
John Saunders

É por causa desse tipo de lixo que você deve evitar as escolas. Se alguma coisa, isso é ainda pior do que as coisas terríveis que eles têm sobre JavaScript.

Como regra geral, eu sugeriria que o conteúdo - ou seja, os dados que devem ser consumidos por um usuário final (seja uma leitura humana ou uma máquina que recebe informações para processamento) - estão melhor contidos em um elemento. Metadados - por exemplo, um ID associado a um conteúdo, mas apenas de valor para uso interno, em vez de exibição para o usuário final - devem estar em um atributo.

0
NickFitz

Você provavelmente poderia ver o problema de maneira semântica.

Se os dados estiverem mais ligados ao elemento, seria um atributo. 

ou seja: um ID de um elemento, eu colocaria como um atributo do elemento.

Mas é verdade que, ao analisar um documento, os atributos podem causar mais dores de cabeça do que elementos.

Tudo depende de você e de como você projeta seu esquema.

0
HyLian

Aqui está outra coisa que você deve ter em mente ao decidir sobre um formato XML: Se bem me lembro, os valores dos atributos "id" não devem ser todos numéricos, eles devem atender às regras para nomes em XML. E, claro, os valores devem ser únicos. Eu tenho um projeto que deve processar arquivos que não atendem a esses requisitos (embora eles são limpos XML em outros aspectos), o que tornou o processamento dos arquivos mais complicado.

0
Grimarr