2009-04-24 4 views
1

フィールドのタイプがDataTableのクラスが1つあります。DataTableを含むクラスのXMLスキーマ

このクラスのXSDを書きたいと思います。私の問題は、datable構造が固定されていないということです。列は動的に追加されます。どのようにそのようなクラスのXSDを書くのですか?

XSDが定義されたら、XSDに対してXMLにシリアル化されたクラスを検証する必要があります。

答えて

1

シリアライズされたxmlをXSDに対して検証する場合、それはある構造に適合しなければならないが非常に柔軟性があることを意味します。 XSDとさまざまな属性とパラメータを作成する方法を学ぶ必要があります。あなたが望む構造が何であれ、それを定義し始めたら、プロセスを始めるとそれほど難しくはありません。特定の問題の質問をした後、SOコミュニティが役立ちます。

基本XSDチュートリアルhttp://www.w3schools.com/Schema/ 液体xml studioでXSDを作成できます。そのフリーおよびGUIベースhttp://www.liquid-technologies.com/

0

一般に、列が動的である場合、XSDも動的でなければなりません。 適切なxls要素(クラステーブルを表す要素)に対してxlsステートメントを動的に作成するテーブル列を作成する補完関数を実装する方法があります。もちろん、xsdの静的な部分をあらかじめ定義し、xsdの動的に作成された部分とマージする必要があります。

XMLで作業しているあなたはスタイラススタジオをお勧めします。

1

特定の列自体を定義するのではなく、スキーマが列を定義する方法を定義するメタフォーマットが必要なように聞こえます。

この種のxmlは、醜く冗長な傾向があります(xmlrpcとsoapなど)。また、スキーマは実際の列を検証できず、正しく定義されていることを意味します。あなたが構造化された値(文字列だけでなく)が必要な場合は、その後、もちろん、

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

:XSDは、このようなものになるだろう

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

XMLは次のようになりますもう少し複雑なものが必要です。任意のオブジェクトが必要な場合は、各オブジェクトのマップとして、値を順番にマップすることができます。要素スキーマ定義は再帰的である必要があるため、別のインスタンスを保持できます。これは基本的にxmlrpcとsoapの機能です。

EDITこれはあなたの "列" に適合しませんが、一例は以下のとおりです。

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

文法の基本的な考え方:ルートが常にあるので

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

は、変更オブジェクト:名前:

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

このためのXSD:

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