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>