2013-03-26 53 views
15

Sono ancora un po 'nuovo per XML Schema ecc. E ho lavorato per sviluppare alcuni XML, Schema e un foglio di stile (XSLT). Ho fatto progressi ragionevoli, ma poi mi sono reso conto che il mio schema aveva smesso di funzionare, quindi l'ho riportato a un esempio non descrittivo più semplice.Convalida schema XML: Impossibile trovare la dichiarazione dell'elemento

Ecco il mio XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="Test.Namespace" 
     schemaLocation="http://myNameSpace.com Test1.xsd"> 
    <element1 id="001"> 
     <element2 id="001.1"> 
      <element3 id="001.1" /> 
     </element2> 
    </element1> 
</Root> 

ho scritto uno schema che è qui:

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="Test.Namespace" 
      elementFormDefault="qualified"> 
    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="element1Type"> 
     <xsd:sequence> 
      <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="element2Type"> 
     <xsd:sequence> 
      <xsd:element name="item" type="element3Type"/> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="element3Type"> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType>   
</xsd:schema> 

Lo schema rappresentativa della struttura del mio vero XML.

Ora, quando cerco di convalidare il mio XML, ottengo questo errore:

cvc-elt.1: Cannot find the declaration of element 'Root'. [7]

Questo credo sia a che fare con un problema di spazio dei nomi sull'elemento radice, ma io non sono davvero sicuro.

Qualcuno può suggerire cosa sto facendo male, per favore.

risposta

14

cvc-elt.1: Cannot find the declaration of element 'Root'. [7]

l'attributo schemaLocation sull'elemento radice dovrebbe essere xsi:schemaLocation, ed è necessario per risolvere il problema di utilizzare lo spazio dei nomi a destra.

Probabilmente si dovrebbe cambiare il targetNamespace dello schema e la xmlns del documento da http://myNameSpace.com (dal namespace dovrebbero essere valide URI, che Test.Namespace non è, anche se urn:Test.Namespace sarebbe ok). Una volta fatto, dovrebbe trovare lo schema. Il punto è che tutti e tre lo spazio dei nomi di destinazione dello schema, lo spazio dei nomi del documento e lo spazio dei nomi per il quale si sta assegnando la posizione dello schema devono essere uguali.

(anche se ancora non convaliderà il tuo <element2> contiene una <element3> nel documento in cui lo schema prevede item)

+3

Ho corretto quanto segue come suggerito e ora funziona Il chiarimento dei "Nomi" Tre era quello di cui avevo bisogno. – Nerdio

1

La targetNamespace del vostro schema XML non corrisponde al namespace del Root elemento (punto in Test.Namespace vs. virgola nella Test,Namespace)

Una volta fatta la sopra d'accordo, è necessario considerare che il vostro element2 ha un attributo ordina non presente nell'XSD.

+0

Grazie per questo, e individuando due errori evidenti. Ho corretto questi; 'codice' 'codice' (Scusate, non mi sembra di aver inserito il codice correttamente). Il problema è ancora lì ... – Nerdio

17

Grazie a tutti al di sopra, ma questo è ora risolto. Per il bene degli altri l'errore più significativo è stato nell'allineare i tre namespace come suggerito da Ian.

Per completezza, ecco il codice XML corretto e XSD

Ecco l'XML, con errori di battitura corretti (mi dispiace per la confusione causata dalla mancanza di prontezza)

<?xml version="1.0" encoding="UTF-8"?> 

<Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="urn:Test.Namespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <element1 id="001"> 
     <element2 id="001.1"> 
      <element3 id="001.1" /> 
     </element2> 
    </element1> 
</Root> 

e, qui è lo schema

<?xml version="1.0"?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="urn:Test.Namespace" 
      xmlns="urn:Test.Namespace" 
      elementFormDefault="qualified"> 
    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="element1Type"> 
     <xsd:sequence> 
      <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="element2Type"> 
     <xsd:sequence> 
      <xsd:element name="element3" type="element3Type"/> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="element3Type"> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType>   
</xsd:schema> 

Grazie ancora a tutti, spero che questo sia utile a qualcun altro in futuro.

+4

Se posso suggerire un paio di miglioramenti alla tua risposta: dovresti annullare la mia risposta, aspettare un giorno penso, e poi accettare la tua poiché tecnicamente parlando il tuo contiene tutte le correzioni; Fisserei anche la parte NID di te URN che non è valida (rimuovi '.' che è un carattere non valido per un NID) e aggiungo anche la parte NSS obbligatoria, separata da un'altra': '. La schemaLocation è solo un suggerimento, i validatori di XSD sono liberi di ignorarlo, se non per ragioni di sicurezza - ecco perché non dovrebbe mai essere una ragione per cui un XML non è valido o no. –

Problemi correlati