Im trabajando para automatizar la prueba de una API que toma y devuelve XML, por lo que quiero traducir los datos de retorno documentados de la API en el esquema tanto como sea posible. Elegí RelaxNG para esta tarea en función de la facilidad de uso y el aprendizaje.¿Puede relajar especificar un conjunto desordenado de elementos con el mismo nombre, pero con diferentes atributos?
Antes me tiro en toda la info, aquí está la pregunta: ¿
¿Es posible describir "conjunto no ordenado de elementos, con el mismo nombre pero diferentes atributos"?
Aquí es un objeto de muestra de lo que estoy teniendo problemas para describirlos:
<item>
<id>d395136e-d060-4a6e-887c-c0337dd7ad09</id>
<name>The item has a name</name>
<link rel="self" type="type1" href="url" />
<link rel="download" type="type2" href="url" />
<link rel="relatedData" type="type3" href="url" />
</item>
Los objetos de enlace son la parte que me estoy colgó. Aquí está el problema:
- El orden de los elementos en el interior artículo no está garantizado, por lo que estoy tratando de poner todos los elementos en
<interleave>
estructura. - Habrá múltiples elementos
<link>
dentro de<item>
, con diferentes conjuntos de atributos (es decir,<item>
DEBE tener un enlace 'propio', un enlace 'descargar' y un enlace 'relatedData' para ser válido). - Se requiere uno de cada tipo de enlace, pero nuevamente no se garantiza el orden.
Me trataron de describir el esquema de este modo:
<element name="item">
<interleave>
<element name="id"><text/></element>
<element name="name"><text/></element>
<ref name="selfLink"/>
<ref name="launchLink"/>
<ref name="thumbnailLink"/>
</interleave>
</element>
las referencias 'enlace' se definen en otro lugar de este modo:
<define name="selfLink">
<element name="link">
<attribute name="href"><text/></attribute>
<attribute name="rel"><value>self</value></attribute>
<attribute name="type"><value>type1</value></attribute>
</element>
</define>
El analizador no está satisfecho sobre esto - de Jing Obtengo error: the element "link" can occur in more than one operand of "interleave"
. Puedo ver lo que está pasando, pero esperaba poder manejar la idea de 'elementos con el mismo nombre pero diferentes atributos' como elementos únicos.
Al mover los enlaces de referencia de intercalación lo analiza, pero estaré esperando que el validador explote cada vez que el pedido cambie en los datos devueltos.
¿Alguna idea, o es esto imposible? ¿Existe un problema inherente con el XML que estoy procesando que me obligue a mover parte de esto a una lógica de procesamiento más alta en mi aplicación de prueba (compruebe manualmente cada tipo de enlace después de ejecutar una validación XML más genérica?)
Cuando se dice "diferentes atributos", es lo que realmente quiere decir "diferentes valores de los atributos"? – mzjn
En realidad, sí, gracias por la aclaración. El mismo conjunto de atributos con diferentes requisitos de valor. – James