2009-06-22 13 views
1

J'ai essayé de comprendre comment utiliser un schéma XML pour valider des fichiers XML lorsque je les charge dans une application. J'ai cette partie qui fonctionne, mais je n'arrive pas à obtenir que le schéma reconnaisse autre chose que l'élément racine comme valide. Par exemple, je le fichier XML suivant:Sous-éléments et espaces de noms dans XSD

<fun xmlns="http://ttdi.us/I/am/having/fun" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://ttdi.us/I/am/having/fun 
          test.xsd"> 
    <activity>rowing</activity> 
    <activity>eating</activity> 
    <activity>coding</activity> 
</fun> 

avec les éléments suivants (certes généré par le visuel éditeur, je ne suis qu'un simple mortel) XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun"> 
    <xsd:element name="fun" type="activityList"></xsd:element> 

    <xsd:complexType name="activityList"> 
     <xsd:sequence> 
      <xsd:element name="activity" type="xsd:string" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Mais maintenant, en utilisant Eclipse est construit -En (? base Xerces-) validateur, je reçois l'erreur suivante:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'activity'. One of '{activity}' is expected. 

alors, comment puis-je réparer mon XSD pour que ... il fonctionne? Tous les résultats de recherche que j'ai vus jusqu'ici semblent dire «... alors j'ai juste désactivé la validation» ou «... alors je me suis débarrassé des espaces de noms» et ce n'est pas quelque chose que je veux faire.

ADDENDA:

Maintenant, disons que je change mon schéma à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun"> 
    <xsd:element name="activity" type="xsd:string"></xsd:element> 

    <xsd:element name="fun"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="activity" minOccurs="0" maxOccurs="unbounded"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Maintenant, cela fonctionne, mais est-ce que la méthode signifie que je suis autorisé à avoir <actvity> à la racine de mon document ? Et si le ref doit juste être remplacé tel quel, pourquoi ne puis-je pas remplacer ref="actvity" par name="activity" type="xsd:string"?

ADDENDA COMPLEMENTAIRES: TOUJOURS faire, ou bien vous passerez des heures et des heures cogner la tête sur un mur:

DocumentBuilderFactory dbf; 
// initialize dbf 
dbf.setNamespaceAware(true); 

Répondre

1

Cette XSD valident correctement here:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun"> 

    <!-- definition of simple element(s) --> 
    <xsd:element name="activity" type="xsd:string"></xsd:element> 

    <!-- definition of complex element(s) --> 
    <xsd:element name="fun"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element ref="activity" maxOccurs="unbounded" minOccurs="0"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 
+0

donc, est de mettre tous ces éléments dans la racine du document le "juste"/chose acceptée à faire? Cela semble juste un peu drôle d'abord de le regarder. –

+0

Vous pouvez aussi facilement spécifier l'élément 'activity' dans l'élément 'fun' (au lieu d'utiliser l'attribut 'ref'): Cependant, si votre schéma devient plus complexe, vous pouvez préférer décomposer les définitions comme ci-dessus. Les deux méthodes sont "correctes/acceptées". – bernie

+0

Mais alors si je fais ce que vous suggérez dans ce commentaire, il se casse de nouveau, avec le même message d'erreur qu'avant. Je suis complètement perplexe. et j'ai l'impression de manquer quelque chose de fondamental. –