2009-01-23 8 views
1

Je dois créer un schéma pour un format XML déjà utilisé. Le XML existant est déjà généré par un programme différent, et il semble qu'il serait difficile de retrouver tous les endroits qui auraient besoin d'être changés pour utiliser un format XML plus régulier.Schéma XML - contourner la contrainte de balise unique

Voici un exemple similaire à notre structure XML:

<data> 
    <summary>some info</summary> 
    <error>error message (only if there was an error)</error> 
    <details>more info 
     <x>more</x> 
     <y>even more</y> 
    </details> 
    <error>another error message</error> 
    <z>some extra info</z> 
</data> 

Notez que l'étiquette d'erreur est réutilisée au même niveau et vient après certains articles, mais pas d'autres, donc je ne peux pas mettre maxOccurs = » sans bornes". J'ai essayé d'encapsuler les paires d'erreurs/autres balises associées dans une séquence xsd: mais cela ne fait pas l'affaire parce que je suis encore en train de casser la règle d'Attribution de Particules Unique.

Cela peut-il être fait, ou dois-je faire savoir aux autres développeurs que ce schéma ne va pas être validé?

+0

Votre exemple n'est pas bien formé en XML (deux balises de détails de fermeture). Je suggère que vous corrigiez ceci et fournissiez d'autres exemples pour démontrer la variation dans le XML qui doit être manipulé. – Alohci

+0

Désolé, supprimé la balise de fermeture superflue pour plus de détails. – rob

+0

il n'était pas étranger, je pense qu'il était une faute de frappe sur le – annakata

Répondre

2

Ma lecture du XML schema standard dit que vous êtes probablement en sécurité. Vous définissez simplement des éléments non consécutifs avec le même nom dans votre schéma, afin de refléter le XML tel qu'il sera (ou peut être) généré. Tant que toutes les instances "erreur" sont toujours séparés par d'autres éléments et non consécutifs, cela ne devrait pas poser de problème. Par exemple, quelque chose comme:

 
    <xs:element name="data"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" /> 
     <xs:element ref="error" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" /> 
     <xs:element ref="error" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="error" type="xs:string"/> 

    <xs:complexType name="detailsType"> 
    .... 
    </xs:complexType> 

Si les détails a minOccurs = « 0 » et le premier « erreur » ci-dessus a un maxOccurs> 1, vous ne parvenez pas la règle d'attribution unique de particules, car la validation ne peut pas vérifier, si vous avoir deux éléments d'erreur dans une rangée, quelle instance de "erreur" dans le schéma auquel ils appartiennent. Cependant, tant que chaque instance de "error" peut être identifiée de manière unique dans le schéma, en raison de la bonne utilisation de "minOccurs" et "maxOccurs" pour les éléments d'erreur et pour les éléments intermédiaires, alors vous êtes bon.

Vous pouvez même avoir des instances consécutives d '"erreur" tant que le validateur de schéma peut toujours déterminer sans ambiguïté quelle instance est référencée en utilisant minOccurs et maxOccurs (par exemple). Pensez à xhtml, dans lequel les éléments peuvent apparaître dans n'importe quel ordre, avec une répétition arbitraire.

EDIT: mise à jour pour refléter les modifications dans la question d'origine.