2009-04-24 6 views
1

Ich habe eine Klasse, die Feld des Typs DataTable hat.XML-Schema für eine Klasse mit einer DataTable

Ich möchte XSD für diese Klasse schreiben. Mein Problem ist die datierbare Struktur ist nicht behoben. Die Spalten werden dynamisch hinzugefügt. Wie schreibe ich XSD für eine solche Klasse?

Sobald die XSD definiert ist, möchte ich die Klasse validiert gegen XSD XML validieren.

Antwort

1

Wenn Sie die serialisierte XML-Datei gegen eine XSD validieren, bedeutet dies, dass sie einer bestimmten Struktur entsprechen muss, aber sie kann sehr flexibel sein. Sie müssen lernen, wie Sie ein XSD und die verschiedenen Attribute und Parameter erstellen. Welche Struktur Sie auch immer definieren möchten, sobald Sie mit dem Prozess beginnen, wird es nicht so schwierig. Nach dem Stellen bestimmter Problemfragen und SO-Community wird helfen.

Grundlegende XSD Tutorial http://www.w3schools.com/Schema/ Sie können flüssige Xml Studio XSD erstellen. Seine freie und GUI-basierte http://www.liquid-technologies.com/

0

Im Allgemeinen, wenn Spalten dynamisch sind, muss XSD auch dynamisch sein. Eine Lösung könnte sein, komplementäre Funktion zu derjenigen zu implementieren, die Tabellenspalten erstellt, Funktion, die dynamisch xls-Anweisung für das adäquate xls-Element (das die Klassentabelle darstellt) erzeugt. Natürlich muss der eine statische Teile von xsd im Voraus definieren und diesen mit dynamisch erzeugten Teilen von xsd zusammenführen.

Arbeite mit XML Ich empfehle Ihnen Stylus Studio.

1

Klingt, als ob Sie ein Meta-Format benötigen, in dem das Schema eine Möglichkeit zum Definieren der Spalten definiert, anstatt selbst bestimmte Spalten zu definieren.

Diese Art von XML neigt dazu, hässlich und ausführlich (z. B. xmlrpc und Seife) zu sein. Es bedeutet auch, dass das Schema die tatsächlichen Spalten nicht validieren kann, sondern nur, dass sie korrekt definiert wurden.

Die XML würde wie folgt aussehen:

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

Die XSD etwas so sein würde:

<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> 

Natürlich können Sie, wenn Sie strukturierte Werte müssen (nicht nur Strings), dann Ich brauche etwas Komplexeres. Wenn Sie beliebige Objekte benötigen, können diese als Map für jedes Objekt dargestellt werden, wobei die Werte wiederum Maps sein können. Die Elementschemadefinition muss rekursiv sein, damit sie eine andere Instanz von sich selbst enthalten kann. Dies ist im Grunde, was xmlrpc und Soap tun.

EDIT Das funktioniert nicht mit Ihrem "Spalten" passen, aber ein Beispiel ist:

<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> 

Grundidee der Grammatik:

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

geändert, so dass die Wurzel ist immer ein Objekt und benannt:

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

Eine XSD für diese:

<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>