で使用しXML Data Binding Wizard
ていDelphi XE2
ます。スキーマには、このタイプの必須タグがあります。
<xs:element name="MyReport" type="MyReportType" />
<xs:complexType name="MyReportType">
<xs:all>
<xs:element name="Header" type="HeaderType" />
<xs:element name="Values" type="ValuesType" />
<xs:element name="Events" type="EventsType" />
</xs:all>
</xs:complexType>
問題は、たとえばValues
-groupに要素を追加しない場合、-tagがなく<Values>
、XMLファイルがに対する検証に失敗することXSD
です。インターフェースがValues
-タグを「追加」するためのメソッドを提供している場合、これはおそらく問題にはなりません。
これを処理する標準的な方法はありますか、または生成されたコードを誤って使用していますか?
簡単に言えば存在する、任意のコードを使用して、ワークアラウンド又はそうでなければ、方法は、Data Binding Wizard
以下を生成するために、XML
所与の(子ノードが存在しない場合に上記のスキーマを使用して検証するために必要とされるものである)HeaderType
、ValuesType
およびEventsType
複合型のものです:
<MyReport>
<Header />
<Values />
<Events />
</MyReport>
(<xs:sequence>
最終的なXML
ファイルで正しい順序を強制しないことによって生成されたコードなど、他にも同様の問題があることは知っていますが、少なくともその問題については、単純に子を正しい順序で挿入することによる回避策があります。Embarcadero
これらの機能の多くを考慮に入れている完全なインターフェースを提供するのは良いことです。
注文について言及したときに、問題の根本をすでに発見しました。生成されたクラスは、XMLオブジェクトモデルのダムラッパーです。要求されたときにのみ存在します。文字列型の場合、これは簡単です(空の文字列を追加するだけです)が、複雑な型の場合、nilが機能するかどうかはわかりません。
—
Leonardo Herrera
これは実際にはまったく真実ではありません。(親のValues-tagの下にある)Value-itemsのコレクションが存在するように
—
Randomeister
TXMLValuesType.AfterConstruction
読み取るRegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;
ためのコード。これにより、空のValues-tagを作成することが非常に難しくなります。空の値リストが効果的に強制するからあなたを停止しますSaveToFile
生成するために<Values />
-タグ
@Randomeister-XSDのminOccurs = "1"属性を試してください:<xs:all maxOccurs = "1">。また、<xs:all>の代わりに<xs:sequence>を使用してみてください。私はバインディングウィザード(Delphi XEで)をうまく処理して問題は発生していませんが、ウィザードが順序と必須の値を理解できるように、型と属性を正しく宣言していることを確認する必要があります。
—
2013年