使用 Delphi XML 数据绑定向导时不存在必需的标记
Posted
技术标签:
【中文标题】使用 Delphi XML 数据绑定向导时不存在必需的标记【英文标题】:Required tags not present when using Delphi XML Data Binding Wizard 【发布时间】:2012-09-22 09:07:07 【问题描述】:我在Delphi XE2
中使用XML Data Binding Wizard
。
架构具有这种类型的必需标签:
<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
是 complexType:
<MyReport>
<Header />
<Values />
<Events />
</MyReport>
(我知道还有其他类似的问题,比如<xs:sequence>
生成的代码没有在最终的XML
-文件中强制执行正确的顺序,但至少对于那个,只需插入孩子们按正确的顺序排列。我仍然认为如果Embarcadero
能提供一个完整的界面,它会考虑到更多这些功能。)
【问题讨论】:
在提到订购时,您已经发现了问题的根源。生成的类是 XML 对象模型的一个哑包装;它只会在被要求时才存在。对于字符串类型,这很容易(只需添加一个空字符串),但对于复杂类型,我不确定 nil 是否可以工作。 这实际上并不完全正确。TXMLValuesType.AfterConstruction
的代码为 RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;
,因此存在值项的集合(在父值标签下),这使得创建空值标签变得如此困难。空值列表将有效阻止您强制 SaveToFile
生成 <Values />
-tag
@Randomeister - 在 XSD 中尝试 minOccurs="1" 属性:。另外,尝试使用 不确定是否理解,但也许您正在寻找的是:use="optional"
<xs:element name="MyReport" type="MyReportType" />
<xs:complexType name="MyReportType">
<xs:all>
<xs:element name="Header" type="HeaderType" use="optional" />
<xs:element name="Values" type="ValuesType" use="optional" />
<xs:element name="Events" type="EventsType" use="optional" />
</xs:all>
</xs:complexType>
告诉我是否可以。
【讨论】:
以上是关于使用 Delphi XML 数据绑定向导时不存在必需的标记的主要内容,如果未能解决你的问题,请参考以下文章