我正在使用XML Data Binding Wizard
in 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等添加任何元素,则不会有<Values>
-tag,并且XML文件将无法针对进行验证XSD
。如果接口提供了一种“添加” Values
-tag 的方法,那么这可能不会成为问题。
是否有处理此问题的标准方法,还是我在错误地使用生成的代码?
简单地说,有没有任何办法,变通或以其它方式使用从代码Data Binding Wizard
,生成以下XML
(这是使用上述模式时,有没有子节点需要什么来验证),给出HeaderType
,ValuesType
并EventsType
有复杂类型的:
<MyReport>
<Header />
<Values />
<Events />
</MyReport>
(我知道还有其他类似的问题,例如通过<xs:sequence>
在最终XML
文件中不强制执行正确的顺序而生成的代码,但至少对于该问题,存在一种解决方法,只需按正确的顺序插入子代即可。我仍然认为如果Embarcadero
能提供一个完整的界面,并考虑更多这些功能,那就太好了。)
提到订购时,您已经发现问题的根源。生成的类是XML对象模型周围的哑包;它只会在被要求时存在。对于字符串类型,这很容易(只需添加一个空字符串),但是对于复杂类型,我不确定nil是否会起作用。
—
莱昂纳多·埃雷拉
这实际上不是很正确。
—
Randomeister,2012年
TXMLValuesType.AfterConstruction
读取代码,RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;
因此存在值项集合(在父值标签下),这使得创建空值标签非常困难。空的“值列表”将有效地阻止您强制SaveToFile
生成<Values />
-tag
@Randomeister-尝试在您的XSD中使用minOccurs =“ 1”属性:<xs:all maxOccurs =“ 1”>。另外,尝试使用<xs:sequence>代替<xs:all>。我已经使用绑定向导(在Delphi XE中)进行了很好的处理,并且没有遇到任何问题-但是您必须确保正确声明类型和属性,以便向导可以理解顺序和必需值。
—
矢量