with - esquema xml y utilizando una opción como la raíz del documento
xml with css (3)
Tengo un poco de una pregunta de esquema xml novato. Creo que la respuesta es que lo que necesito hacer no es posible con el esquema, pero me gustaría estar seguro. El problema es que tengo un servicio web que devuelve una respuesta con un tipo de elemento raíz en caso de éxito (por ejemplo, <Respuesta>) y, en caso de falla completa, devuelve un documento con un elemento raíz diferente (por ejemplo, <Excepción>). Entonces, básicamente, dos documentos completamente diferentes:
<Respuesta> ...... </ Response> O
<Excepción> .... </ Exception>
¿Es posible describir estos dos documentos diferentes con un documento de esquema? Es como si quisiera una opción como el primer elemento en el elemento de esquema, pero esa no es una sintaxis válida. He intentado un par de variantes que analizan como xsd válidas, pero no validan los documentos. ¿Alguna sugerencia? ¿O esto simplemente no es posible? Muchas gracias de antemano - m
No es posible, pero la alternativa no es tan mala. Simplemente declare un nodo raíz que se escribe como una opción, y haga que su aplicación devuelva un nodo de "respuesta" con un hijo "exitoso" o "de excepción". Si no puede cambiar la aplicación, no tiene suerte, pero con una respuesta tan simple, ¿no podría crear dos esquemas diferentes, leer el primer nodo de Child y luego aplicar el esquema correspondiente?
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Response">
<xs:complexType>
<xs:choice>
<xs:element name="Success"/>
<xs:element name="Exception"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
En realidad, el esquema XML le permite definir elementos raíz alternativos en un único esquema, aunque no mediante el elemento de choice
. En cambio, todo lo que necesita hacer es enumerar cada una de las raíces posibles como hijos directos de su elemento de schema
.
Por ejemplo, dado el siguiente esquema XML:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foo">
...
</xs:element>
<xs:element name="bar">
...
</xs:element>
</xs:schema>
Cualquiera de los siguientes documentos validaría en su contra:
<foo>
...
</foo>
O:
<bar>
...
</bar>
Me encontré con esta publicación y pensé que vale la pena mencionar lo que imagino del mundo de Spring Web Services (aquellos que dan importancia al contrato de datos primero).
Una de las mejores maneras de negociar este problema de elemento raíz es definir directamente varios elementos raíz bajo el elemento de esquema como ha mencionado Phil Booth.
Sin embargo, cuando se trata de las mejores prácticas y el marco de servicios web que dan prioridad a los datos, primero es importante un diseño de esquema infalible. Cuando alguien define un esquema como este -
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foo">
...
</xs:element>
<xs:element name="bar">
...
</xs:element>
un marco de servicio web como Spring-WS, que se basa en el llamado esquema de contrato de datos para generar el servicio web, puede no ser capaz de entender si <foo> o <bar> es el elemento raíz de solicitud del servicio.
Por favor, consulte este enlace - Contrato de datos
En tales casos, he encontrado útil el enfoque dado por "John at CashCommons" o Stephen Rushing.