estructura - xml example
¿Cómo debe estructurar su archivo xml? (8)
En general, quiere que los elementos representen la información "real" que está modelando, y los atributos de reserva para la información "meta", que califica el contenido.
Esta pregunta ya tiene una respuesta aquí:
- XML attribute vs XML element 20 respuestas
Al crear un nuevo archivo xml, ¿cómo se estructura el archivo correctamente o de la mejor manera posible? Por estructura, que puede no ser la mejor palabra en este caso, me refiero a cómo se elige entre hacer que un elemento o un atributo de un elemento. Por ejemplo, si creo un archivo Person.xml que contiene una lista de Personas, ¿es mejor hacer algo como esto?
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Age>23</Age>
</Person>
¿o es mejor hacer algo como esto o incluso importa?
<Person FirstName="John" LastName="Doe" Age="23"></Person>
Es más o menos una cosa subjetiva.
La primera es la forma verbosa de hacer las cosas: todo es un elemento. Esta es una forma común en que las personas hacen esto simplemente porque es muy fácil de ver y analizar.
Sin embargo, los atributos se introdujeron solo por esta razón: son fragmentos de información sobre el elemento. Entonces, tu segundo ejemplo es perfectamente aceptable. De hecho, incluso podrías acortarlo:
<Person FirstName="John" LastName="Doe" Age="23" />
Probablemente haga esto último.
La única vez que no desearía esto es si necesita tener más datos xml dentro, o secciones de formato largo.
Los archivos XML deben (no comenzar una guerra santa) estructurarse de la siguiente manera:
Si se trata de datos, o algo que se puede cambiar, entonces debería ser así:
<Person>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
<Age>23</Age>
</Person>
Si se trata de un atributo de la Person
, debería ser así:
<Person Type="Human">
<FirstName>John</FirstName>
<LastName>Smith</LastName>
<Age>23</Age>
</Person>
Existen varias razones para esta práctica, una de las cuales incluye la facilidad de corregir las transformaciones XSLT cada vez que cambia el método de recuperación de los datos de la persona.
Esa es realmente la parte importante: los atributos definen información sobre los datos (el tipo de persona), y los datos son algo que debe llenar esos agujeros. Si decide cómo va a cambiar la forma de rellenar esos agujeros, se hace más difícil si los ha convertido en "atributos" en lugar de "datos" cuando desea Transformar su XML más adelante.
Me parece que esto es algo parecido a Chevy vs Ford, o Windows vs MacOS. No hay un ganador claro para todas las situaciones, y la mera pregunta puede generar una "discusión" altamente volátil con los participantes correctos. ;)
La respuesta corta es que cualquiera de ellos puede ser apropiado dependiendo de la situación. A veces, el factor decisivo es incluso qué biblioteca elige para leer o actualizar los datos en el XML.
Realmente no importa, pero la forma en que decido es: si algo podría considerarse una entidad por sí mismo (en este ejemplo, Persona, lo hago un elemento. Si es algo que modifica la entidad (o un atributo de la entidad) ), Lo hago un atributo.
Ejemplo:
<Person FirstName="John" LastName="Doe" Age="23">
<Clothing wet="No">
<Shirt colour="Red" />
</Clothing>
</Person>
Independientemente del gusto personal, aquí está el conjunto fundamental de problemas:
Use atributos para asignar valores a nombres únicos cuando el pedido no es significativo. De lo contrario, usa elementos.
- Valores: números, cadenas, fechas, etc., pero no objetos de propiedades múltiples.
- Nombres únicos: cada nombre de atributo en un elemento debe ser único. Si una cosa representada por un elemento puede tener más de un Foo asociado con ella, Foo no debería ser un atributo.
- El pedido no es significativo: la aplicación no puede depender de los valores que se presenten a los procesos en un orden particular.
Un ejemplo: si desea datos de ida y vuelta entre (digamos) ADO.NET y XML, ¿debe almacenar valores de columna en atributos o elementos? (No importa por un momento que ADO.NET haga esto por usted.) Bueno, los nombres de las columnas se asignan a los valores de manera única, y los valores de las columnas son tipos de datos fácilmente serializables. Muy seguro, ¿por qué no hacer esto?
<Person FirstName="John" MiddleName="Q." LastName="Smith"/>
Pero en realidad esa es una transformación que destruye la información. El orden en que aparecen las columnas en un registro de ADO.NET es significativo. Si hay algo en la columna 2 antes de su transformación, debería estar en la columna 2 después. Convertirlos en atributos perderá esta información. (Conozco una implementación DOM, por ejemplo, que recupera atributos en orden alfabético por nombre).
Esta es la razón por la cual ADO.NET representa filas como esta, aunque es muy detallada:
<Person>
<FirstName>John</FirstName>
<MiddleName>Q.</MiddleName>
<LastName>Smith</LastName>
</Person>
En cuanto a la sabiduría común de que los elementos son para información, y los atributos son para metainformación: a menudo es un buen consejo. A menudo, también es superstición lo que los llevará a lugares malos.
Por un lado, la metainformación puede necesitar contener múltiples valores asociados con el mismo nombre. Puede, por ejemplo, querer etiquetar un elemento con una lista de páginas que lo usará:
<Person Pages="B1,B2,B3,B4">
<FirstName>John...
¿Alguna vez intentó escribir una plantilla XSLT que analiza una lista separada por comas? Aprenderá mucho al hacerlo, pero probablemente no sea algo que quiera saber.
Por otro lado, los diseñadores de XML que no saben a lo que se enfrentan, permiten que estos consejos los lleven a poner un atributo que debería ser realmente en el nombre de la etiqueta del elemento. Por ejemplo:
<Person Type="Employee">
<SSN>123-45-6789</SSN>
<Extension>123</Extension>
</Person>
<Person Type="Customer">
<PhoneNumber>123-456-7890</PhoneNumber>
<BillingAddress>...
y así. Adivina qué sucede cuando tratas de escribir un esquema que impone reglas diferentes sobre los elementos Person
función del atributo Type
. Fracaso. Los esquemas están vinculados al nombre del elemento. Todos los elementos Person
deben tener el mismo esquema. En este caso, los elementos deben llamarse Employee
y Customer
.
Aquí hay un artículo bastante bueno sobre los principios del diseño XML: