2012-07-01 14 views
5

Dato lo schema (anonimi, i punti chiave di interesse vengono rinominati e il resto omessi):Perché questo XDocument ha esito negativo la convalida?

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

e l'istanza (dichiarato utilizzando letterali VB XML):

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

convalida non riesce con il messaggio The element 'inspec' in namespace 'the_right_namespace' has incomplete content. List of possible elements expected: 'a_scalar_property'.

Perché? L'elemento all, secondo W3Schools:

"L'elemento all specifica che gli elementi figlio possono apparire in qualsiasi ordine e che ogni elemento figlio può verificarsi zero o una volta."

Tralasciando a_scalar_property è lo stesso come comprendente cronometra a zero. Perché questo documento non riesce a convalidare?

e non dire cose come 'inserire il codice completo' - questo non è il mio IP e ho anonima per una buona ragione. C'è molto poco altro, e ho provato con questo esempio minimo, dà lo stesso risultato.

+0

Rilevante: (. Non sto dicendo che sarebbe necessariamente sbagliato in questo caso) http://w3fools.com/ – JJJ

+0

Grazie - Non ho trovato W3Schools molto utile, ma lo ho incluso come riferimento che probabilmente tutti hanno sentito parlare - e spero davvero che la prima frase della pagina su un pezzo fondamentale di Xml Schema sia corretta! –

risposta

6

È necessario specificare l'minOccurs="0" per ogni elemento facoltativo in 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

Grazie. Sembra stupido che devo preoccuparmi - qual è il punto di '' se devo ancora annotare ogni elemento comunque? Ancora, risolve il problema. –

+0

Felice di aiutare. 'xs: all' risolve solo la parte" in qualsiasi ordine "... e probabilmente ti rimane ancora l'opportunità di incontrare le gioie quando hai bisogno di" qualsiasi ordine "E" zero, uno o più ". – Filburt

2

Per effettuare un elemento opzionale, i minOccurrs attributo deve essere 0, anche in un < tutto> gruppo. Ottenere che dalla lettura della specifica schema XML è molto ingombrante, ma basandosi su W3Schools non è una buona alternativa.

+0

[Documentazione su MSDN] (http://msdn.microsoft.com/en-us/library/ms256182) è fuorviante allo stesso modo: * "Consente agli elementi del gruppo di apparire (o non apparire) in qualsiasi ordine nell'elemento contenente. "* – Filburt

Problemi correlati