2009-04-24 5 views
1

J'ai une classe qui a un champ de type DataTable.Schéma XML pour une classe contenant un DataTable

Je veux écrire XSD pour cette classe. Mon problème est que la structure datable n'est pas corrigée. Les colonnes sont ajoutées dynamiquement. Comment écrire XSD pour une telle classe? Une fois la définition XSD définie, je souhaite valider la classe sérialisée en XML par rapport à la XSD.

Répondre

1

Si vous validez le xml sérialisé par rapport à un XSD, cela signifie qu'il doit être conforme à une certaine structure mais qu'il peut être très flexible. Vous devez apprendre à créer un XSD et les différents attributs et paramètres. Quelle que soit la structure que vous voulez commencer à définir, une fois que vous démarrez le processus, ce ne sera pas si difficile. Après avoir posé une question de problème spécifique et la communauté de SO aidera.

Didacticiel XSD de base http://www.w3schools.com/Schema/ Vous pouvez utiliser le logiciel xml studio pour créer XSD. Son http://www.liquid-technologies.com/

0

En règle générale, si les colonnes sont dynamiques, XSD devra également être dynamique. Une solution pourrait être d'implémenter une fonction complémentaire à celle qui crée des colonnes de table, fonction qui crée dynamiquement une instruction xls pour l'élément xls adéquat (celui représentant la table de classes). Bien sûr, celui-ci doit d'avance définir les parties statiques de xsd et les fusionner avec les parties de xsd créées dynamiquement. Pour travailler avec XML, je vous suggère Stylus Studio.

1

On dirait que vous avez besoin d'un méta-format, dans lequel le schéma définit une manière de définir les colonnes, au lieu de définir des colonnes spécifiques.

Ce type de fichier XML a tendance à être moche et prolixe (par exemple, considérons xmlrpc et soap). Cela signifie également que le schéma ne peut pas valider les colonnes réelles et seulement qu'elles ont été définies correctement.

Le XML ressemblerait à quelque chose comme ceci:

<DataTable> 
    <column name="..." value="..."/> 
    <column name="..." value="..."/> 
</DataTable> 

Le XSD serait quelque chose comme ceci:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DataTable"> 
    <xs:complexType> 
     <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="column"> 
      <xs:complexType> 
      <xs:attribute name="name" type="xs:string"/> 
      <xs:attribute name="value" type="xs:string"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Bien sûr, si vous avez besoin des valeurs structurées (pas seulement les chaînes), vous Je vais avoir besoin de quelque chose d'un peu plus complexe. Si vous avez besoin d'objets arbitraires, ils peuvent être représentés comme une carte pour chaque objet, avec des valeurs qui peuvent être des cartes, etc. La définition de schéma d'élément doit être récursive, donc elle peut contenir une autre instance de lui-même. C'est essentiellement ce que font xmlrpc et soap.

EDIT Cela ne correspond pas à vos "colonnes", mais un exemple est:

<object name="contact"> 
    <object name="home"> 
    <object name="tel"> 
     <string name="area" value="910"/> 
     <string name="num" value="1234 5678"/> 
    </object> 
    </object> 
    <object name="work"> 
    <object name="tel"> 
     <string name="area" value="701"/> 
     <string name="num" value="8888 8888"/> 
    </object> 
    <object name="fax"> 
     <string name="area" value="701"/> 
     <string name="num" value="9999 9999"/> 
    </object> 
    </object> 
</object> 

idée de base de la grammaire:

V --> string | O  // a Value is a string or an Object 
O --> (K V)*   // an Object is list of named values (Key-Value pairs) 

Changé, de sorte que la racine est toujours un objet, et nommé:

O ==> (string K | O)* K 

Un XSD pour cela:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="object"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 

     <xs:element name="string"> 
      <xs:complexType> 
      <xs:attribute name="name" type="xs:string"/> 
      <xs:attribute name="value" type="xs:string"/> 
      </xs:complexType> 
     </xs:element> 

     <xs:element ref="object"/> 

     </xs:choice> 
     <xs:attribute name="name" type="xs:string"/> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
Questions connexes