2017-09-17 1 views
0

Je suis en train de trouver la meilleure façon de mettre en œuvre la structure suivante pour le fichier XML en utilisant le Schéma XSD:séquence XSD avec condition particulière à la fin

<Vertice></Vertice> 
<Edge></Edge> 
...any number of Vertices and Edges between... 
<Vertice></Vertice> 
<Edge></Edge> 

Il doit toujours contenir Start-Vertice, fin Vertice et un bord entre eux, mais éventuellement il peut contenir autant de sommets au milieu que nécessaire, chacun d'entre eux entouré par des bords (XML sera créé plus tard par JAXB sur la base de ce schéma). J'essayais d'utiliser quelque chose comme ça, mais ça ne compile pas. Y a-t-il un moyen approprié de l'implémenter?

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <!-- declaration --> 
    <xs:complexType name="graphType"> 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
      <xs:element name="vertice" type="xs:string"/> 
      <xs:element name="edge" type="xs:string"/> 
     </xs:sequence> 
     <xs:element name="vertice" type="xs:string"/>  <!-- this line is not working --> 
    </xs:complexType> 

    <!-- printing --> 
    <xs:element name="Graph" type="graphType"/> 

</xs:schema> 

J'ai aussi compris quelque chose comme ça, mais il n'a pas le droit d'utiliser une nouvelle fois le même nom, donc je aurais besoin de changer le nom de la dernière Vertice. Mais peut-être existe-t-il un moyen de contourner ce problème?

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <!-- declaration --> 
    <xs:complexType name="graphType"> 
     <xs:sequence> 
      <xs:sequence minOccurs="2" maxOccurs="unbounded"> 
       <xs:element name="vertice" type="xs:string"/> 
       <xs:element name="edge" type="xs:string"/> 
      </xs:sequence> 
      <xs:element name="vertice-end" type="xs:string"/> 
      <!-- is there a workaround to repeat the name "vertice" for this element? --> 
     </xs:sequence> 
    </xs:complexType> 

    <!-- printing --> 
    <xs:element name="Graph" type="graphType"/> 

</xs:schema> 

Répondre

0

simplement le faire dans l'autre sens, i.e. considérer votre modèle doit commencer par une vertice, puis est une séquence de edge + vertice (il est le même, non?). De cette façon, vous êtes assuré que vous finissez toujours sur un élément vertice.

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <!-- declaration --> 
    <xs:complexType name="graphType"> 
     <xs:sequence> 
      <xs:element name="vertice" type="xs:string"/> 
      <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
       <xs:element name="edge" type="xs:string"/> 
       <xs:element name="vertice" type="xs:string"/> 
      </xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 

    <!-- printing --> 
    <xs:element name="Graph" type="graphType"/> 

</xs:schema> 

Vous étiez probablement face à un problème appelé particules unique Attribution, vous pouvez lire plus ici https://www.w3.org/wiki/UniqueParticleAttribution (ou faire votre propre recherche).

+0

Super, merci beaucoup - bien sûr, cela correspond au résultat dont j'avais besoin. Cependant, je ne vois pas pourquoi il n'a pas compilé quand l'élément vertice a été ajouté après la séquence et il l'a fait quand il était avant la séquence - une magie de XSD je suppose que je dois me souvenir :) Ou est-il simple explication de cela? – Piotr

+0

En fait, un autre problème vient d'apparaître - La prochaine étape consistait à générer des classes Java en utilisant XJC, mais cela me donne une erreur. [ERROR] L'élément "vertice" apparaît dans plus d'une propriété. Si c'est pertinent, ma version XJC est 'xjc 2.2.8-b130911.1802'. Est-il possible d'appliquer une solution de contournement pour cela? – Piotr

+0

Salut - en ce qui concerne votre premier commentaire, s'il vous plaît jeter un oeil sur le lien que j'ai fourni à la fin de la réponse, c'est l'explication pourquoi vous n'êtes pas autorisé à définir votre contenu comme vous l'avez fait. En ce qui concerne votre deuxième commentaire, je crois que vous devriez poser une nouvelle question. – potame