2009-10-28 8 views
11

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>). Así que, básicamente, dos documentos completamente diferentes:esquema xml y usando una opción como la raíz del documento

< respuesta> ...... </respuesta> O
< Excepción> .... </Excepción>

¿Es posible para describir estos dos documentos diferentes con uno 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

+0

¿Ha considerado buscar el formato para las solicitudes/respuestas XML-RPC? También devuelven una respuesta o excepción. Si no puede encontrar nada mejor, aquí están mis notas: http://www.chrisbunney.com/wiki/index.php/XML-RPC_protocol – chrisbunney

Respuesta

31

En realidad, el esquema XML le permite definir elementos raíz alternativos en un solo esquema, aunque no mediante el elemento choice. En cambio, todo lo que necesita hacer es enumerar cada una de las raíces posibles como hijos directos de su elemento schema.

Por ejemplo, dada la 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 contra ella:

<foo> 
    ... 
</foo> 

O:

<bar> 
    ... 
</bar> 
+0

Validado esto en http://tools.decisionsoft.com/schemaValidate/so +1 – chrisbunney

+0

Caray - eso debería haber sido obvio. ¡Gracias! – mikey

+0

Esta puede ser una solución ordenada donde varios nodos raíz comparten una gran cantidad de la misma estructura. El único inconveniente que veo es que puede necesitar una verificación inicial para asegurarse de que el nodo raíz sea el esperado. –

-1

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> 
1

me encontré con este post y me pareció que vale la pena mencionar lo que figura a partir de Servicios Web Spring mundo (los 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 en 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 servicios web como Primavera-WS, que se basa en este 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 remítase a este enlace - Data Contract

En tales casos, he encontrado que el enfoque dado por "John en CashCommons" o Stephen Corriendo útil.

Cuestiones relacionadas