2009-07-20 12 views
7

Digamos que desea permitir que un determinado elemento XML ocurra 0+ veces. Por ejemplo, el elemento <record> puede ocurrir varias veces:¿Usa un elemento XML principal como contenedor para elementos secundarios recurrentes?

<repository> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
</repository> 

¿Hay razones de peso para incluir un elemento padre como un contenedor para estos? Por ejemplo, la siguiente utiliza el elemento <recordSet> para contener los elementos <record>:

<repository> 
    <recordSet> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
    </recordSet> 
</repository> 

He intentado encontrar cualquier pregunta relacionada antes de plantear esta, así que mis disculpas si se ha pedido ya. Gracias de antemano por cualquier entrada!


Editar-22 julio de 2009:

Gracias a todos por la excelente respuesta! (Yo comentaría/votaría personas, pero aún no tengo suficientes puntos de reputación.) Probablemente seguiré adelante con esta ruta, y también quiero agradecerles a @ 16bytes por sus consejos, incluso para simplemente nombrar a los padres. usando el plural de los elementos secundarios recurrentes.

Respuesta

3

Tener un elemento primario hace que sea más fácil identificar secciones del XML y facilita a los manejadores el mapeo de los elementos secundarios a una colección. Si tiene un sistema que prohíbe el uso de atributos (algunos lo hacen, es molesto), también necesita usar elementos de contenedor para distinguir las propiedades (como los identificadores) que pertenecen a niños específicos.

Aparte de eso, es válido omitir el elemento principal y puede hacer que el archivo sea notablemente menos detallado.

En el primer ejemplo, un elemento de usuario podría ser mezclados con los registros, esto es válido pero podría ser difícil de detectar: ​​

<repository> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <user>Bill</user> 
    <record>Record 3</record> 
</repository> 

Mientras que con un elemento alrededores se puede separar la colección, y tener varias instancias de esa colección:

<repositories> 
    <users> 
    <user>Bill</user> 
    </users> 
    <repository> 
    <id>id1</id> 
    <recordSet> 
     <id>recordSet1</id> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    <recordSet> 
     <id>recordSet2</id> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    </repository> 
    <repository> 
    <id>id2</id> 
    <recordSet> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    </repository> 
</repositories> 
1

eso es útil si en su <repository> desea permitir múltiples elementos: <recordSet>

<repository> 
    <recordSet id="1"> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
    </recordSet> 
    <recordSet id="2"> 
    <record>Record 2.1</record> 
    <record>Record 2.2</record> 
    <record>Record 2.3</record> 
    </recordSet> 
</repository> 
+0

debe hacer referencia a los valores de los atributos en su ejemplo. –

+0

@Rich: hecho. simplemente estaba armando psuedo-xml – akf

10

Ha tropezado con la segunda de mis reglas de guía de diseño XML (la primera es usar atributos solo para ID y metadatos reales, la tercera es no usar espacios de nombres a menos que sepa lo que está haciendo) que trato de usar al diseñar documentos xml.Además de ser una buena regla empírica, sino que también hace su documento:

  • más fácil de modelo en el esquema XML u otros lenguajes de validación
    • también más fácil de volver a utilizar el tipo complejo
  • más fácil de leer (en mi humilde opinión)
  • fácil para los usuarios asimilen al atravesar el documento
  • (antes mencionado) más fácil de enlazar a un objeto programación orientada a objetos de su elección

Una sugerencia, me gustaría probar:

<Root> 
    <Items> 
    <Item>a</Item> 
    <Item>b</Item> 
    <Item>c</Item> 
    </Items> 
</Root> 

El sufijo simple "s" es más breve y más fácil de recordar y aplicar. Si usa un nombre de colección genérico, usted o un colega olvidará cuál de ellos eventualmente, por lo que verá Conjuntos mezclados con Listas mezclados con Contenedor. Pero eso es más estilo que las buenas prácticas y no quiero iniciar una guerra religiosa;!)

(UpperCamel para los elementos !, lowerCamel para los atributos --sorry)

2

Aunque también tengo una preferencia instintiva por colecciones envueltas, es interesante observar que Google tienen una opinión diferente.

No DEBEN utilizarse elementos XML que simplemente envuelvan elementos repetitivos secundarios. [Justificación: no se usan en Atom y no agregan nada.]

Cuestiones relacionadas