2012-07-01 20 views
5

Dado el esquema de (anónima, los puntos clave de interés se cambia el nombre y el resto omitidas):¿Por qué este XDocument falla la validación?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="inspec" 
    targetNamespace="the_right_namespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="inspec"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="a_scalar_property" type="xs:int"/> 
     <xs:element name="a_collection_property"> 
      <xs:complexType> 
      <snip> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="another_collection_property"> 
      <xs:complexType>     
      <snip> 
      </xs:complexType> 
     </xs:element>      
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

y la instancia (declarado mediante literales VB XML):

Dim xDocument = 
<x:inspec xmlns:x='the_right_namespace'> 
<a_collection_property/> 
<another_collection_property/> 
</x:inspec> 

validación falla con el mensaje The element 'inspec' in namespace 'the_right_namespace' has incomplete content. List of possible elements expected: 'a_scalar_property'.

¿Por qué? El elemento all, según W3Schools:

"El elemento all especifica que los elementos secundarios pueden aparecer en cualquier orden y que cada elemento secundario puede aparecer cero o una vez".

Omitir a_scalar_property es lo mismo que incluirlo cero veces. ¿Por qué este documento no puede validar?

Y no diga cosas como 'publicar el código completo' - esta no es mi dirección IP y la he anonimizado por una buena razón. Hay muy poco más que hacer, y he probado con este ejemplo mínimo, da el mismo resultado.

+0

relevante: (. No estoy diciendo que necesariamente estar equivocado en este caso) http://w3fools.com/ – JJJ

+0

Gracias. No he encontrado W3Schools demasiado útil, pero lo he incluido como una referencia de la que probablemente todo el mundo haya oído hablar, y ¡realmente esperarías que la primera oración de la página sobre una pieza fundamental de Xml Schema fuera correcta! –

Respuesta

6

es necesario especificar el minOccurs="0" para cada elemento opcional en xs:all:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="inspec" 
    targetNamespace="the_right_namespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="inspec"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="a_scalar_property" type="xs:int" minOccurs="0" /> 
       <xs:element name="a_collection_property" minOccurs="0"> 
        <xs:complexType> 
         <!-- snip --> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="another_collection_property" minOccurs="0"> 
        <xs:complexType> 
         <!-- snip --> 
        </xs:complexType> 
       </xs:element> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Gracias. Parece estúpido que tengo que molestarme. ¿De qué sirve '' si todavía tengo que anotar cada elemento? Aún así, resuelve el problema. –

+0

Me alegra ayudar. 'xs: all' solo resuelve la parte" en cualquier orden "... y probablemente todavía te encuentres con las alegrías cuando necesites" cualquier orden "Y" cero, uno o más ". – Filburt

2

Para hacer que un elemento sea opcional, el atributo minOccurrs debe ser 0, incluso en un grupo 0> < todo>. Obtener eso de leer la especificación del esquema XML es realmente engorroso, pero confiar en w3schools no es una buena alternativa.

+0

[Documentación en MSDN] (http://msdn.microsoft.com/en-us/library/ms256182) es engañoso de la misma manera: * "Permite que los elementos en el grupo aparezcan (o no aparezcan) en cualquier orden en el elemento contenedor. "* – Filburt

Cuestiones relacionadas