2010-01-20 29 views
10

Duplicar posibles:
Should I use Elements or Attributes in XML?elementos XML vs Atributos

que nunca han sido capaces de averiguar cuándo utilizar atributos XML. I siempre elementos de uso. Acabo de leer this w3schools article. El artículo afirma que es una mala práctica de utilizar atributos porque:

  • atributos no pueden contener múltiples valores (elementos secundarios lata)
  • atributos no son fácilmente ampliable (por cambios futuros)
  • atributos no pueden describir las estructuras (elementos secundarios puede)
  • atributos son más difíciles de manipular por el código del programa
  • valores de atributos no son fáciles de probar con una DTD

La única excepción que indica es cuando está asignando una identificación a una etiqueta.

¿Es esto correcto? ¿Por qué los atributos incluso existen entonces? ¿Fue un error de diseño con xml? ¿Hay algo que me falta aquí?

La única razón por la que podría pensar para usar atributos sería para las relaciones uno a uno. es decir: nombre. Pero tendría que ser una relación de uno a uno con algo que es primitivo (o cadena). Porque sería importante que en el futuro no desee dividirlo en varias secciones diferentes. es decir:

<date> May 23, 2001 </date> 

a:

<date> 
    <month> May </month> 
    <d> 23 </d> 
    <yr> 2001 </yr> 
</date> 

Debido a que este no sería posible con un atributo.

Bono pregunta: En el ejemplo, la fecha sería posible hacer algo como esto:

<date> 
    <default> May 23, 200 </default> 
    <month> May </month> 
    <d> 23 </d> 
    <yr> 2001 </yr> 
</date> 

dar a las aplicaciones futuras más información (o diferente), mientras que todavía ofrece apps mismo formato existente? ¿O usted tiene que hacer esto:

<date> May 23, 2001 </date> 
<NEWdate> 
    <month> May </month> 
    <d> 23 </d> 
    <yr> 2001 </yr> 
</NEWdate> 
+2

month, d, yr son convenciones de nomenclatura TERRIBLE, o la falta de ellas –

+0

@skaffman: Creo que no es un duplicado exacto. Aunque el ejemplo es similar, la pregunta es ligeramente diferente. Las respuestas a la pregunta me parecieron algo útiles, mientras que la respuesta de @ Guffa (y otras) a esta pregunta me resultó muy útil. – sixtyfootersdude

Respuesta

12

Los atributos son buenos cuando desea adjuntar información a otra información, tal vez para describir cómo debe interpretarse la información. Por ejemplo:

<speed unit="mph">65</speed> 
+0

que es interesante, pero ¿por qué no hacerlo un elemento separado? – sixtyfootersdude

+2

Puede hacerlo con elementos: a la máquina no le importa. Este es un tema de estilo, en beneficio de los humanos. –

+0

@sixtyfootersdude: Entonces tendría que anidarlo un nivel más profundo al agregar unidades y elementos de valor en el elemento de velocidad. Alternativamente, agréguelo al mismo nivel con un nombre como speedUnit, pero aún no está tan claramente unido al elemento de velocidad. – Guffa

1

Todos los puntos del artículo de w3schools son absolutamente válidas y correctas. Estoy de acuerdo: casi nunca uso atributos en mis documentos XML.

La única vez que los usaría podría ser cuando necesito identificar una entidad, p.

<Customer Id="123123"> 
.... 
</Customer> 

Pero incluso aquí, es una sacudida. Podrías poner fácilmente esa ID en un elemento <ID>123123</ID>.

Por otra parte, en mi caso, ya que el WCF DataContractSerializer no soporta atributos XML (por razones de rendimiento), que es una razón más para no usarlos (mucho):

3

Los puntos que la lista acerca de los elementos son correctos, y me gustaría añadir lo siguiente:

  • elementos en general, hacer diferenciaciones más bonitas (más legibles) cuando es necesario comparar las revisiones de un archivo

Pero a veces el uso de un elemento para modelar un punto de datos es exagerado, especialmente cuando tiene muchos puntos de datos pequeños y heterogéneos dentro de un elemento principal único. Usar atributos para cosas simples puede mejorar la legibilidad. Algunos probablemente argumentarán que XML no es legible o que los humanos lo deben leer/editar ... pero lo hago todo el tiempo.

Considere este ejemplo (hipervínculo básico):

<a href="http://www.htmlhelp.com/" title="Help Information" target="_top">Web Design Group</a> 

¿Le gustaría que si tuviera que escribir o leer de esta manera en su lugar?

<a> 
    <href>http://www.htmlhelp.com/</href> 
    <title>Help Information</title> 
    <target>_top</target> 
    <text>Web Design Group</text> 
</a> 

Para mí eso parece mucho ruido.

+1

excepto cuando los atributos hacen que la línea se salga de la ventana como se indica arriba :) –

0

"¿Por qué los atributos existen incluso entonces?"

Para permitir un código XML más conciso, solo para guardar su tipeo. Y, por supuesto, cualquier archivo XML que contiene los atributos

<element attr1="val1" attr2="val2" ... attrN="valN"> 
    <nestedElement> 
    ... 
    </nestedElement> 
</element> 

se puede convertir facilmente a un "atributos" uno:

<element> 
     <attributes> 
     <attr1>val1</attr1> 
     <attr2>val2</attr2> 
     ... 
     <attrN>valN</attrN> 
     </attributes> 
     <nestedElement> 
     ... 
     </nestedElement> 
    </element> 
+1

"La integridad en el marcado XML es de mínima importancia". - Lenguaje de marcado extensible (XML) 1.0 (Quinta edición) –

+0

+ 1 ... @Pete: Eso es opinión y no hecho (incluso si está en el documento técnico). Hay muchas razones por las que el espacio sigue siendo un problema. Dispositivos móviles, hardware integrado, enlaces lentos de datos.Trate de lidiar con XML inflado a través de una conexión en serie de un solo cable entre una interfaz Ethernet y un chip de memoria flash usando solo un procesador de 100MHz y 4MB de RAM. –

+1

Es la opción de las personas que diseñaron XML, que tienen autoridad en el diseño de XML. Los atributos en XML no existen para proporcionar una representación terser, ya sea que eso también se pueda usar o no para ese efecto. Para decir por qué están en XML, debe mirar SGML y pensar en aplicar el marcado al texto en lugar de representar las estructuras de datos de forma escueta. –

0

Esta pregunta ya me han hecho rasco la cabeza también. Para mí, es una cuestión de semántica. Parece más natural para mí hacer

<page size="a4"> 

que

<page> 
    <size>a4</size> 
</page> 
2

atributos son sólo eso atributos del elemento. si necesita anidar múltiples elementos, entonces usa elementos. En su ejemplo de fecha, generalmente solo uso atributos, porque es más pequeño.

<date month="12" day="31" year="2009"/> 

si mucho más fácil de tratar y más pequeño para almacenar y enviar a través del cable, así, y podría decirse que más fácil para un ser humano para leer también. Una fecha nunca tendrá varios días, meses o años, por lo que no hay ninguna razón para hacerlos elementos.

+0

Ese es un buen punto. Los atributos deben ser una relación de uno a uno. Bonificación – sixtyfootersdude

2

Piense en un bloque de información de contacto ...

<!-- attribute version --> 
<person name="Matt" age="27"> 
    <phone type="mobile" value="1234567890" /> 
    <phone type="work" value="1234560987" /> 
    <address type="home" 
      city="NoWhere" 
      state="OH" 
      street="123 Lost Ave." 
      zipcode="12345" /> 
</person> 

<!-- element version --> 
<person> 
    <name>Matt</name> 
    <age>27</age> 
    <phone> 
     <type>mobile</type> 
     <value>1234567890</value> 
    </phone> 
    <phone> 
     <type>work</type> 
     <value>1234560987</value> 
    </phone> 
    <address> 
     <type>home</type> 
     <city>NoWhere</city> 
     <state>OH</state> 
     <street>123 Lost Ave.</street> 
     <zipcode>12345</zipcode> 
    </address> 
</person> 

... se puede ampliar estos fuera en elementos.Sin embargo, si está procesando cientos, y posiblemente millones de registros, la sobrecarga adicional de las etiquetas finales puede hinchar los archivos. Esto podría causar problemas en sistemas con memoria/procesador restringido y/o enlaces de datos lentos. Tirar basura de tu XML con elementos también puede hacer que sea mucho más difícil leer y entender tu XML visualmente. Si bien la experiencia visual de los datos puede no ser importante para la transferencia y el almacenamiento, y puede ser muy importante para la configuración y el mantenimiento.

Otro problema que puede surgir al usar elementos de todo es cuando intenta utilizar datos desde fuera de su base de código; le resulta mucho más difícil saber si los elementos pueden repetirse o si solo deben contener una información simple. Sí, puede restringir esto con XSD y DTD, pero eso suele ser más difícil que simplemente hacer que el XML sea fácil de entender.

En cuanto a su pregunta de bonificación ... El control de versiones de los esquemas XML dependerá de la plataforma que esté desarrollando y cuán estricto sea su código y plataforma contra el esquema. XML (y archivos binarios) pueden ser muy flexibles ... eso realmente explica por qué XML es extensible.

+0

: eso es lo que también pensé. Solo me preguntaba si había algún estándar. – sixtyfootersdude

+0

Cuando comienzas a jugar en el nivel de abstracción entre formatos de datos diferentes en diferentes aplicaciones y versiones, es bastante difícil escanear los datos de una manera "estándar". Pero es por eso que tenemos XSLT. –

0

Generalmente uso atributos para el conjunto mínimo de campos que hacen que un nodo sea único. En otras palabras, representan la clave principal. Esto facilita algunas cosas si necesita correlacionar XML con una base de datos relacional.

2

No olvide que los atributos se analizan como parte de la etiqueta de inicio. Esto significa que mientras está analizando, obtiene esos valores de inmediato, no tiene que esperar a que se cierre la etiqueta. Además, no invocará todos los eventos de análisis (si está realizando el análisis de flujo) para todas las etiquetas de elemento.

Prefiero usar atributos para los metadatos sobre el elemento que se incluye. Por ejemplo, me gustaría expresar las fechas como <date format="dd-MMM-yyyy">20-Jan-2010</date>. Si tienes elementos de datos inequívocos, adelante y solo hazlos atributos. <name first="Tom" last="Jones"/> funciona para muchos casos.

Cuestiones relacionadas