Pergunta

No trabalho, foi-nos pedido para criar arquivos XML para passar dados para outro aplicativo off-line que irá, em seguida, crie um segundo arquivo XML para passar de volta para a atualização de alguns de nossos dados.Durante o processo que nós estamos discutindo com a equipe do outro aplicativo sobre a estrutura do arquivo XML.

O exemplo veio-me é essencialmente algo como:

<INVENTORY>
   <ITEM serialNumber="something" location="something" barcode="something">
      <TYPE modelNumber="something" vendor="something"/> 
   </ITEM>
</INVENTORY>

A outra equipe, disse que este não era o padrão da indústria e que atributos deve ser usado apenas para a meta de dados.Eles sugeriram:

<INVENTORY>
   <ITEM>
      <SERIALNUMBER>something</SERIALNUMBER>
      <LOCATION>something</LOCATION>
      <BARCODE>something</BARCODE>
      <TYPE>
         <MODELNUMBER>something</MODELNUMBER>
         <VENDOR>something</VENDOR>
      </TYPE>
   </ITEM>
</INVENTORY>

A razão de eu sugeri a primeira é que o tamanho do arquivo criado é muito menor.Haverá cerca de 80000 itens que estarão no arquivo durante a transferência.A sua sugestão na realidade acaba por ser três vezes maior do que o que eu sugeri.Procurei o misterioso "Padrão da Indústria", que foi mencionado, mas o mais próximo que eu poderia encontrar era que atributos XML deveria ser utilizado apenas para meta-dados, mas disse que o debate foi sobre o que foi realmente meta-dados.

Após o longo fôlego explicação (desculpe) como você determina o que é meta-dados, e ao projetar a estrutura de um documento XML, como você deve decidir quando usar um atributo ou de um elemento?

Foi útil?

Solução

Eu uso essa regra de ouro:

  1. Um Atributo é algo que é auto-contido, por exemplo, uma cor, uma IDENTIFICAÇÃO, um nome.
  2. Um Elemento é algo que faz ou pode ter atributos próprios ou de conter outros elementos.

Então, é seu, é perto.Eu teria feito algo como:

EDITAR:Atualizado exemplo original, com base nos comentários abaixo.

  <ITEM serialNumber="something">
      <BARCODE encoding="Code39">something</BARCODE>
      <LOCATION>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

Outras dicas

Alguns dos problemas com os atributos são:

  • atributos não podem conter múltiplos valores (elementos filho pode)
  • os atributos não são facilmente expansível (para futuras alterações)
  • os atributos não podem descrever estruturas (elementos filho pode)
  • atributos são mais difíceis de manipular, e o código de programa
  • valores de atributo não são fáceis de se testar contra um DTD

Se você usar atributos como contêineres de dados, você acaba com documentos que são difíceis de ler e manter.Tente usar elementos para descrever dados.O uso dos atributos apenas para fornecer informações que não são relevantes para os dados.

Não acaba assim (não é assim que o XML deve ser usado):

<note day="12" month="11" year="2002" 
      to="Tove" to2="John" from="Jani" heading="Reminder"  
      body="Don't forget me this weekend!"> 
</note>

Fonte: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp

"XML" significa "eXtensible Marcação Linguagem".Uma linguagem de marcação implica que os dados de texto, marcado com metadados sobre a estrutura ou de formatação.

XHTML é um exemplo de XML utilizado a forma como foi concebido:

<p><span lang="es">El Jefe</span> insists that you
    <em class="urgent">MUST</em> complete your project by Friday.</p>

Aqui, a distinção entre elementos e atributos é claro.Elementos de texto são exibidos no navegador, e os atributos são instruções sobre como para exibi-los (apesar de existirem algumas tags que não funciona assim).

A confusão surge quando o XML é usado não como uma linguagem de marcação, mas como um serialização de dados a linguagem, em que a distinção entre "dados" e de "metadados" é mais vago.Portanto, a escolha entre elementos e atributos é mais ou menos arbitrária, exceto para as coisas que não pode ser representado com atributos (ver feenster a resposta).

Elemento XML vs Atributo XML

XML é toda sobre o acordo. Primeiro adiar a qualquer esquemas XML ou convenções estabelecidas dentro de sua comunidade ou indústria.

Se você está realmente em uma situação para definir o esquema a partir do zero, aqui estão algumas considerações gerais que devem informar a elemento vs atributo de decisão:

<versus>
  <element attribute="Meta content">
    Content
  </element>
  <element attribute="Flat">
    <parent>
      <child>Hierarchical</child>
    </parent>
  </element>
  <element attribute="Unordered">
    <ol>
      <li>Has</li>
      <li>order</li>
    </ol>
  </element>
  <element attribute="Must copy to reuse">
    Can reference to re-use
  </element>
  <element attribute="For software">
    For humans
  </element>
  <element attribute="Extreme use leads to micro-parsing">
    Extreme use leads to document bloat
  </element>
  <element attribute="Unique names">
    Unique or non-unique names
  </element>
  <element attribute="SAX parse: read first">
    SAX parse: read later
  </element>
  <element attribute="DTD: default value">
    DTD: no default value
  </element>
</versus>

Pode depender do seu uso.XML que é usado para representar stuctured dados gerados a partir de um banco de dados pode funcionar bem, em última análise, com valores de campo que está sendo colocado como atributos.

No entanto XML usado como um transporte de mensagens vezes seria melhor utilizar mais elementos.

Por exemplo, digamos que tinha esse XML, tal como proposto na resposta:-

<INVENTORY>
   <ITEM serialNumber="something" barcode="something">
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
    </ITEM>
</INVENTORY>

Agora queremos enviar o ITEM elemento para um dispositivo de impressão a ele de código de barras no entanto, há uma escolha de tipos de codificação.Como podemos representar o tipo de codificação necessária?De repente percebemos, um pouco tardiamente, que o código de barras não era um único automic valor, mas em vez disso, ele pode ser qualificado com a codificação necessária quando impresso.

   <ITEM serialNumber="something">
      <barcode encoding="Code39">something</barcode>
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

O ponto é que, a menos que você construção de algum tipo de XSD ou DTD, juntamente com um espaço de nomes para fixar a estrutura em pedra, você pode ser melhor servido deixar as opções em aberto.

IMO XML é mais útil quando pode ser dobrado sem quebrar o código existente usando-o.

Eu utilize as seguintes directrizes para o meu esquema de design com relação aos atributos de vs.elementos:

  • Usar elementos de longa duração de texto (geralmente aqueles de cadeia de caracteres ou normalizedString tipos)
  • Não use um atributo se não é um agrupamento de dois valores (e.g.eventStartDate e eventEndDate) para um elemento.No exemplo anterior, deve haver um elemento novo para o "evento", que pode conter a startDate e endDate atributos.
  • Negócios Date, DateTime e números (por exemplo,contagem, quantidade e taxa) deve ser elementos.
  • Não-comerciais de elementos de tempo, como última atualização, validade deve ser os atributos.
  • Não-números do negócio, tais como os códigos de hash e índices devem ser atributos.* Usar elementos se o tipo de complexo.
  • Usar atributos se o valor é um tipo simples, e não se repita.
  • xml:id e xml:lang devem ser atributos de referência o esquema XML
  • Preferem atributos quando tecnicamente possível.

A preferência por atributos é ele fornece o seguinte:

  • exclusivo (o atributo não pode aparecer várias vezes)
  • a ordem não importa
  • as propriedades acima são herdáveis (isso é algo que o "todos" modelo de conteúdo que não são compatíveis com o esquema atual de idioma)
  • o bônus é que eles são menos detalhado e utilizar menos largura de banda, mas que não é realmente um motivo para preferir atributos mais elementos.

Eu adicionados quando tecnicamente possível porque há momentos em que o uso de atributos não são possíveis.Por exemplo, o conjunto de atributos escolhas.Utilizar, por exemplo, (startDate e endDate) xor (startTS e endTS) não é possível com o atual esquema de idioma

Se o Esquema XML é iniciado, permitindo que o "todos" modelo de conteúdo ser restrita ou alargada, em seguida, eu provavelmente iria largá-lo

Não há nenhuma resposta universal para esta pergunta (eu estava muito envolvido na criação do W3C spec).O XML pode ser usada para muitos fins - de texto, como documentos, dados e declarativa código são três dos mais comuns.Eu também uso muito como um modelo de dados.Há aspectos destas aplicações onde os atributos são mais comuns e outros elementos subordinados são mais naturais.Há também dispõe de várias ferramentas que tornam mais fácil ou mais difícil para usá-los.

XHTML é uma área onde os atributos têm um uso natural (e.g.em class='foo').Atributos têm nenhuma ordem, e isso pode torná-lo mais fácil para algumas pessoas a desenvolver ferramentas.OTOH atributos são mais difíceis de escrever sem um esquema.Eu também acho namespace atributos (foo:bar="zork") são muitas vezes mais difícil de gerir em vários conjuntos de ferramentas.Mas ter um olhar para alguns dos W3C línguas para ver a mistura que é comum.SVG, XSLT, XSD, MathML são alguns exemplos bem conhecidos de linguagens e todos têm uma rica fonte de atributos e elementos.Algumas linguagens permitem até mesmo mais do que uma forma de o fazer, por exemplo,

<foo title="bar"/>;

ou

<foo>
  <title>bar</title>;
</foo>;

Note que estes NÃO são equivalentes sintaticamente e necessitam de um apoio explícito em ferramentas de processamento)

O meu conselho seria para ter um olhar para a prática comum na área mais próxima da sua aplicação e, também, considerar que os conjuntos de ferramentas que podem ser aplicadas.

Finalmente, certifique-se de que você diferenciar os espaços de nomes de atributos.Algumas XML sistemas (e.g.Linq) representam espaços de nomes como atributos na API.IMO, isso é feio e potencialmente confuso.

Quando em dúvida, BEIJO -- por que misturar atributos e elementos, quando você não tem uma razão clara para o uso dos atributos.Se mais tarde você decidir definir um XSD, que vai acabar por ser mais limpo também.Então, se você, mesmo depois de decidir para gerar uma estrutura de classe a partir do seu XSD, que será mais simples assim.

a grande questão!

primeiro, não se preocupe muito sobre o desempenho.você vai se surpreender com a rapidez otimizado de um analisador de xml vai rasgar através de seu xml.mais importante ainda, qual é o seu projeto para o futuro:como o XML evolui, como você vai manter a rigidez e a interoperabilidade?

mais concretamente, você pode fazer o modelo de conteúdo de um elemento mais complexo, mas é mais difícil para estender um atributo.

Usar elementos de dados e atributos de meta-dados (dados sobre o elemento de dados).

Se um elemento é mostrar como um predicado em seu selecionar seqüências de caracteres, você tem um bom sinal de que ele deve ser um atributo.Da mesma forma, se um atributo nunca é usado como um predicado, então, talvez, ele não é útil meta-dados.

Lembre-se de que o XML é suposto para ser legível por máquina (não legível para humanos e para grandes documentos XML comprime muito bem.

Outros têm coberto como diferenciar entre atributos de elementos, mas de uma forma mais geral, a perspectiva de colocar tudo em atributos porque faz com que o XML resultante é menor mal.

XML não é projetado para ser compacto, mas para ser portátil e legível para humanos.Se você quer diminuir o tamanho dos dados em trânsito, em seguida, usar algo mais (tal como google protocol buffers).

Pode-se argumentar, de qualquer maneira, mas seus colegas estão certos no sentido de que o XML deve ser usado para o "markup" ou de meta-dados os dados reais.Por sua parte, você está certo no que às vezes é difícil decidir por onde a linha entre o meta-dados, e os dados quando a modelagem de seu domínio em XML.Na prática, o que posso fazer é fingir que nada na marcação é oculto, e apenas os dados fora a marcação é legível.O documento de fazer algum sentido no que maneira?

XML é bastante volumoso.Para o transporte e armazenamento de compressão, é altamente recomendado se você pode pagar o poder de processamento.XML comprime bem, às vezes incrivelmente bem, por causa de sua repetição.Eu tive comprimir arquivos grandes para menos de 5% do seu tamanho original.

Outro ponto a reforçar a sua posição é a de que, enquanto a outra equipe está discutindo sobre o estilo (em que a maioria das ferramentas XML irá lidar com um all-atributo documento tão facilmente como um todo-#PCDATA documento) você está discutindo aspectos práticos.Enquanto o estilo não pode ser totalmente ignorado, méritos técnicos devem carregar mais peso.

Ambos os métodos para armazenar propriedades do objeto são perfeitamente válidas.Você deve partir de considerações pragmáticas.Tente responder a seguinte pergunta:

  1. Que representação leva a uma mais rápida a análise de dados\geração?
  2. Que representação leva a uma mais rápida transferência de dados?
  3. Faz questão de legibilidade?

    ...

É em grande parte uma questão de preferência.Eu uso Elementos para o agrupamento e os atributos de dados, sempre que possível, como eu vejo isso como mais compacto do que a alternativa.

Por exemplo, eu prefiro.....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
         <person name="Rory" surname="Becker" age="30" />
        <person name="Travis" surname="Illig" age="32" />
        <person name="Scott" surname="Hanselman" age="34" />
    </people>
</data>

...Em vez de....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person>
            <name>Rory</name>
            <surname>Becker</surname>
            <age>30</age>
        </person>
        <person>
            <name>Travis</name>
            <surname>Illig</surname>
            <age>32</age>
        </person>
        <person>
            <name>Scott</name>
            <surname>Hanselman</surname>
            <age>34</age>
        </person>
    </people>
</data>

No entanto, se eu tiver dados que não representam facilmente dentro de dizer 20-30 caracteres ou contém muitas citações ou outros caracteres precisam de escape, em seguida, eu diria que é hora de sair os elementos...possivelmente com CData blocos.

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person name="Rory" surname="Becker" age="30" >
            <comment>A programmer whose interested in all sorts of misc stuff. His Blog can be found at http://rorybecker.blogspot.com and he's on twitter as @RoryBecker</comment>
        </person>
        <person name="Travis" surname="Illig" age="32" >
            <comment>A cool guy for who has helped me out with all sorts of SVn information</comment>
        </person>
        <person name="Scott" surname="Hanselman" age="34" >
            <comment>Scott works for MS and has a great podcast available at http://www.hanselminutes.com </comment>
        </person>
    </people>
</data>

Como tirar vantagem do nosso suado de orientação a objetos de intuição?Eu costumo achar que é reta para a frente a pensar que é um objeto e que é um atributo do objeto ou o objeto que ele está se referindo.

Qualquer que intuitivamente fazem sentido como objetos devem caber em como elementos.Seus atributos (ou propriedades) seriam atributos para esses elementos em xml ou criança elemento com o atributo.

Eu acho que para casos mais simples, como no exemplo de orientação a objeto analogia funciona bem para descobrir qual é o elemento e que é atributo de um elemento.

Apenas algumas correções para algumas más informações:

@João Ballinger:Attributies pode conter qualquer caractere de dados.< > & "' precisa ser escapado para o <>&"e ', respectivamente.Se você utilizar uma biblioteca XML, ele vai cuidar disso para você.

Inferno, um atributo pode conter dados binários como uma imagem, se você realmente quiser, apenas por base64 codificação e tornando-as uma de dados:URL.

@feenster:Atributos podem conter separadas por espaço de vários itens, no caso do IDS ou NOMES, que incluem números.Detalhista, mas isso pode acabar economizando espaço.

Usando atributos podem manter XML competitivo com JSON.Ver A Gordura De Marcação:Aparar a Gordura Marcação Mito de calorias em uma hora.

Eu sempre me surpreendo com os resultados desses tipos de discussões.Para mim existe uma regra muito simples para decidir se os dados pertence a um atributo ou como conteúdo e que é se os dados navegáveis sub-estrutura.

Assim, por exemplo, a não-marcação de texto pertence sempre em atributos.Sempre.

Listas pertencem a sub-estrutura ou conteúdo.Texto que pode ao longo do tempo incluem incorporado estruturado de sub-conteúdo pertence o conteúdo.(Na minha experiência, há, relativamente, pouco deste texto com marcação quando utilizar XML para armazenamento de dados ou de troca.)

Esquema XML escrito desta forma é concisa.

Sempre que eu vejo casos como <car><make>Ford</make><color>Red</color></car>, Eu pensei: "caramba que o autor acha que não estavam indo para ser sub-elementos dentro do elemento de fazer?" <car make="Ford" color="Red" /> é significativamente mais legível, não há nenhuma questão sobre como o espaço em branco deve ser processado etc.

Dadas apenas, mas o espaço em branco regras de tratamento, acredito que este foi o claro intuito de XML designers.

Isso é muito claro em HTML, onde as diferenças de atributos e marcações podem ser claramente vistos:

  1. Todos os dados entre a marcação
  2. Os atributos são utilizados para caracterizar esse dados (e.g.formatos)

Se você só tem pura dados como XML, não é menos clara diferença.Dados que poderiam estar entre a marcação ou como atributos.

=> A maioria dos dados deve ficar entre a marcação.

Se você quiser usar atributos aqui:Você poderia dividir os dados em duas categorias:Dados e "meta-dados", onde a meta de dados não faz parte do registro que você deseja apresentar, mas em coisas como a "versão do formato", "data de criação", etc.

<customer format="">
     <name></name>
     ...
</customer>

Também se poderia dizer:"Usar atributos para caracterizar a tag, utilize etiquetas para fornecer dados em si."

Concordo com feenster.Fique longe de atributos se você pode.Elementos evolução amigável e mais interoperáveis entre o serviço web de kits de ferramentas.Você nunca iria encontrar esses kits de ferramentas de serialização seu pedido/resposta de mensagens usando atributos.Isso também faz sentido, pois as nossas mensagens são dados (não metadados) para um serviço da web toolkit.

Atributos podem facilmente tornar-se difícil de gerir longo do tempo, confie em mim.eu sempre ficar longe deles pessoalmente.Os elementos são muito mais explícito e legível/utilizável por ambos os analisadores e usuários.

Só o tempo que eu já usou foi a de definir a extensão de arquivo de um ativo url:

<image type="gif">wank.jpg</image> ...etc etc

eu acho que se você conhecer 100% o atributo não precisa ser expandido você pode usá-los, mas quantas vezes você sabe o que.

<image>
  <url>wank.jpg</url>
  <fileType>gif</fileType>
</image>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top