2010-03-22 7 views
0

Je n'arrive pas à créer un XSD pour certains fichiers XML.Schéma XSD pour XML récursif

Un peu d'arrière-plan pourrait aider. Le XML est pour la messagerie. En particulier, le message est conçu pour être simple et conçu pour être facilement référencé. Au fond, est une valeur de clé récursive configurée.

Simple Les valeurs de clé sont comme ceci.

<key name="quantity">5</key> 
    <key name="price" representation="percentage">99.78</key> 

Il est un attribut de représentation en option où le infromation pourrait être représentée sous deux formes différentes.

référence Les valeurs clés sont comme ça

<key name="currency" reference="instrument"> 
     <id name=" INSID" system="XXXX" instance="PROD">DEM</id> 
     <id name=" EXTERN_ID1" system="XXXX" instance="PROD"> ext128k</id> 
    </key> 

Ce formulaire est utilisé pour les références clés étrangères ou des références à des énumérations. Le service de référence croisée sélectionnera toutes les clés avec un attribut de référence. Il obtiendra alors tous les identifiants possibles pour cette référence, et ajoutera des champs d'identifiant supplémentaires , et remplacera ce sous-élément par la nouvelle version.

-à-dire « ./key[@reference] » comme Xpath peut obtenir toutes les énumérations et des références du xml

Enfin il y a une structure récursive. Ici, la valeur de la valeur de la clé, peut être elle-même une valeur clé.

<key name="trade" type="trade"> 
    <key name="value_day">1999-03-12</key> 
    <key name="quantity">5</key> 
    <key name="leg" type="leg"> 
     <key name="rate">5.00</key> 
     <key name="period">3m</key> 
     <key name="cashflows" type="cashflows"> 
      <key name="cashflow">10</key> 
      <key name="cashflow">20</key> 
     </key> 
    </key> 
</key> 

Maintenant, j'ai de la difficulté à créer un XSD pour cette structure.

Quelqu'un peut-il aider?

Merci

Nick

+0

-ce que les deux premiers extraits XML ont une pertinence à votre problème, ou la troisième structure récursive? –

+0

Si je le reformule comme une hiérarchie d'objets, j'obtiens ceci. KeyValue SimpleKeyValue hérite KeyValue ReferenceKeyValue hérite KeyValue hérite ListKeyValue KeyValue Nick – Nickle

Répondre

2

Si je comprends bien, vous souhaitez que vous pouvez écrire le schéma comme ceci:

<!-- WARNING: this is not valid Schema --> 
<xs:complexType name="composite-key"> 
    <xs:choice maxOccurs="unbounded"> 
    <xs:element name="key" type="simple-key"/> 
    <xs:element name="key" type="composite-key"/> 
    </xs:choice> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
</xs:complexType> 

simple clé serait défini ailleurs. Ce schéma n'est pas valide car vous n'êtes pas autorisé à utiliser deux fois le même nom d'élément. Si Schema soutenait cela, il aurait un diable de temps à désambiguïser les types d'éléments en fonction de leur structure seule.

Si vous avez le contrôle sur XML, vous pouvez le faire en changeant un ou les deux noms d'éléments. Par exemple, on peut utiliser val pour les valeurs simples et obj pour les composites:

<xs:complexType name="composite-key"> 
    <xs:choice maxOccurs="unbounded"> 
    <xs:element name="val" type="simple-key"/> 
    <xs:element name="obj" type="composite-key"/> 
    </xs:choice> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
</xs:complexType> 

Ajustez les noms au goût. Ce serait ma solution recommandée car elle met l'accent sur la clarté. Cependant, les noms des éléments peuvent être hors de votre contrôle.Dans ce cas, une solution moins satisfaisante serait la suivante:

<xs:complexType name="key" mixed="true"> 
    <xs:sequence maxOccurs="unbounded"> 
    <xs:element name="key" type="key"/> 
    </xs:sequence> 
    <xs:attribute name="name" type="xs:string" use="required"/> 
    <xs:attribute name="type" type="xs:string"/> 
    <xs:attribute name="representation" type="xs:string"/> 
</xs:complexType> 

Les principales différences sont ici le type de contenu mixte , et le fait regrettable que la déclaration est maintenant un amalgame des types clés simples et composites. Je dis que c'est "moins satisfaisant" parce que maintenant vous devez effectuer une vérification de validité supplémentaire dans votre propre code, après que Schema en ait fini avec lui. Par exemple, vous devez valider si l'ensemble d'attributs donné a un sens pour le type de clé implicite. En outre, l'exemple tel qu'il est écrit permettrait au texte d'apparaître n'importe où entre les éléments clés imbriqués - probablement quelque chose que vous ne voulez pas.

[edit: la même question est discutée sur stackoverflow here]