Atributo XML frente a elemento XML
En el trabajo, se nos pide que creemos archivos XML para pasar datos a otra aplicación fuera de línea que luego creará un segundo archivo XML para pasar de vuelta y actualizar algunos de nuestros datos. Durante el proceso hemos estado discutiendo con el equipo de la otra aplicación sobre la estructura del archivo XML.
La muestra que se me ocurrió es esencialmente algo como:
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
El otro equipo dijo que esto no era un estándar de la industria y que los atributos solo deberían usarse para metadatos. Sugirieron:
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
La razón por la que sugerí la primera es que el tamaño del archivo creado es mucho más pequeño. Habrá aproximadamente 80.000 elementos en el archivo durante la transferencia. Su sugerencia en realidad resulta ser tres veces mayor que la que yo sugerí. Busqué el misterioso "Estándar de la industria" que se mencionó, pero lo más cercano que pude encontrar fue que los atributos XML solo deberían usarse para metadatos, pero dije que el debate era sobre qué eran realmente metadatos.
Después de la larga explicación (lo siento), ¿cómo se determina qué son los metadatos y, al diseñar la estructura de un documento XML, cómo se debe decidir cuándo utilizar un atributo o un elemento?
Yo uso esta regla general:
- Un Atributo es algo autónomo, es decir, un color, un ID, un nombre.
- Un Elemento es algo que tiene o podría tener atributos propios o contener otros elementos.
Entonces el tuyo está cerca. Habría hecho algo como:
EDITAR : Se actualizó el ejemplo original según los comentarios a continuación.
<ITEM serialNumber="something">
<BARCODE encoding="Code39">something</BARCODE>
<LOCATION>XYX</LOCATION>
<TYPE modelNumber="something">
<VENDOR>YYZ</VENDOR>
</TYPE>
</ITEM>
Algunos de los problemas con los atributos son:
- los atributos no pueden contener múltiples valores (los elementos secundarios sí pueden)
- los atributos no se pueden ampliar fácilmente (para cambios futuros)
- los atributos no pueden describir estructuras (los elementos secundarios sí pueden)
- Los atributos son más difíciles de manipular mediante el código del programa.
- Los valores de los atributos no son fáciles de probar con una DTD.
Si utiliza atributos como contenedores de datos, terminará con documentos que son difíciles de leer y mantener. Intente utilizar elementos para describir datos. Utilice atributos sólo para proporcionar información que no sea relevante para los datos.
No termines así (no es así como se debe usar XML):
<note day="12" month="11" year="2002"
to="Tove" to2="John" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
Fuente: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp
"XML" significa " lenguaje de marcado extensible ". Un lenguaje de marcado implica que los datos son texto, marcados con metadatos sobre estructura o formato.
XHTML es un ejemplo de XML utilizado de la manera prevista:
<p><span lang="es">El Jefe</span> insists that you
<em class="urgent">MUST</em> complete your project by Friday.</p>
Aquí, la distinción entre elementos y atributos es clara. Los elementos de texto se muestran en el navegador y los atributos son instrucciones sobre cómo mostrarlos (aunque hay algunas etiquetas que no funcionan de esa manera).
La confusión surge cuando XML no se utiliza como lenguaje de marcado, sino como lenguaje de serialización de datos , en el que la distinción entre "datos" y "metadatos" es más vaga. Entonces, la elección entre elementos y atributos es más o menos arbitraria, excepto en el caso de cosas que no se pueden representar con atributos (ver la respuesta de Feenster).