2009-11-02 9 views
4

Ok, j'ai donc été chargé d'écrire un XSD à partir d'un document XML qui nous a été donné par un vendeur. Ce fournisseur n'a pas de XSD qu'ils peuvent fournir, donc je suis l'ingénierie inverse. Voici un exemple de la façon dont ce xml est formé:Strange XML schema

<field name="id">1</field> 
<field name="Sport">Football</field> 
<field name="Position">Quarterback</field> 
<field name="Touchdowns">7</field> 
<field name="Interceptions">2</field> 
<field name="Yardage">2000</field> 

Ainsi, puisque tous les éléments sont nommés « champ », je ne parviens pas à créer le schéma pour cela. Voilà ce que j'ai jusqu'à présent:

<xs:element name="field" type="xs:int"> 
    <xs:simpletype> 
     <xs:attribute name="name" type="xs:string" default="id"/> 
    </xs:string> 
</xs:element> 

Le problème que je suis en cours d'exécution en est que tous les éléments auront le même nom. Le logiciel que j'utilise pour écrire le xsd a des problèmes avec ça. Ai-je la bonne approche ici?

Merci pour toute aide.

+0

L'élément champ ne doit pas être de type e chaîne? – csl

+0

Non, car le contenu réel du premier élément était l'ID, qui est un int. – user201051

+0

Sry - devrait être plus descriptif - l'exemple xsd ne contient que le premier élément (le champ id) – user201051

Répondre

2

Vous avez essentiellement un type qui est un élément de base que vous étendez de différentes manières. S'il vous plaît excusez moi si le code est un peu hors, je n'ai pas essayé de valider le schéma et je l'écris de la mémoire, pas un bon moyen d'écrire un schéma, mais vous devriez avoir l'idée.

<xsd:complexType name="field"> 
    <xsd:simpleContent> 
     <xsd:extension> 
      <xsd:attribute name="name" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

pour définir l'élément de base avec le nom de l'attribut (pas de contrainte sur le type d'attribut). Cela validera tous les exemples dans le message original.

alors vous pouvez étendre cette:

<xsd:complexType name="idField"> 
    <xsd:complexContent> 
     <xsd:extension base="field"> 
      ...restrict it in here 
     </xsd:extension> 
    <xsd:complexContent> 
</xsd:complexType> 

Et faire quelque chose comme ça pour chaque variation, essentiellement les rendant les sous-types de la définition principale.

Je réalise que cette "réponse" ne donne pas vraiment de réponse définitive, mais j'espère que ça va vous pousser dans la bonne direction. A défaut, je ne vois pas ce que vous pouvez faire en dehors de demander au fournisseur de réécrire son code XML.

+0

En fait, juste réalisé il peut y avoir un moyen, accrocher comme je l'édite, sacrément ma frappe rapide et lent pensée ... – chrisbunney

+0

Oui , donc l'édition propose un moyen d'étendre un type de champ de base pour correspondre à différentes spécialisations, mais je ne suis pas totalement certain de la précision/validité – chrisbunney

5

La valeur par défaut pour maxOccurs de votre élément est field 1 (essayez donc de le mettre à unbounded), simpleType ne peut pas contenir aussi des attributs ou des sous-éléments.

Je crois que l'exemple suivant fonctionne:

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="fields"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="field"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="field"> 
    <xs:complexType> 
     <xs:attribute name="name" type="xs:string" use="required"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XML:

<?xml version="1.0" ?> 
<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fields.xsd"> 
    <field name="id">1</field> 
    <field name="Sport">Football</field> 
    <field name="Position">Quarterback</field> 
    <field name="Touchdowns">7</field> 
    <field name="Interceptions">2</field> 
    <field name="Yardage">2000</field> 
</fields> 

je xs: string dans le type name, mais je suppose que vous pouvez définir un nouveau type de données pour appliquer uniquement certains mots-clés ...

+0

Il semble bon et valide. Je ferais valoir que, même si un tel schéma générique est valide, il n'ajoute pas grand-chose à part une définition formelle du fichier XML de l'instance.Cependant, c'est probablement le moyen le plus simple de créer un schéma valide (+1) – chrisbunney