使用 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,将没有 &lt;Values&gt;-tag,并且 XML 文件将无法针对 XSD 进行验证。如果接口提供了“添加”Values-tag 的方法,这可能不会成为问题。

是否有处理此问题的标准方法,还是我错误地使用了生成的代码?

简单地说,是否有任何方法,解决方法或其他方法,使用Data Binding Wizard 中的代码,生成以下XML(即当没有子节点时使用上述模式进行验证需要什么),给定 HeaderTypeValuesTypeEventsType 是 complexType:

<MyReport>
  <Header />
  <Values />
  <Events />
</MyReport> 

(我知道还有其他类似的问题,比如&lt;xs:sequence&gt; 生成的代码没有在最终的XML-文件中强制执行正确的顺序,但至少对于那个,只需插入孩子们按正确的顺序排列。我仍然认为如果Embarcadero 能提供一个完整的界面,它会考虑到更多这些功能。)

【问题讨论】:

在提到订购时,您已经发现了问题的根源。生成的类是 XML 对象模型的一个哑包装;它只会在被要求时才存在。对于字符串类型,这很容易(只需添加一个空字符串),但对于复杂类型,我不确定 nil 是否可以工作。 这实际上并不完全正确。 TXMLValuesType.AfterConstruction 的代码为 RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;,因此存在值项的集合(在父值标签下),这使得创建空值标签变得如此困难。空值列表将有效阻止您强制 SaveToFile 生成 &lt;Values /&gt;-tag @Randomeister - 在 XSD 中尝试 minOccurs="1" 属性:。另外,尝试使用 而不是 。我已经很好地处理了绑定向导(在 Delphi XE 中)并且没有遇到任何问题 - 但您必须确保正确声明您的类型和属性,以便向导理解顺序和强制值。 【参考方案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 数据绑定向导时不存在必需的标记的主要内容,如果未能解决你的问题,请参考以下文章

没有 XML 绑定的 XSD 到 Delphi 类

delphi sqlite dbgrideh 锁定数据库

用DELPHI的RTTI实现对象的XML持久化

delphi xe5 fastreport4.14 中文很多时换行不正确

delphi treeview和ADO数据库配合问题

DELPHI使用TClientDataSet时不携带MIDAS.DLL的方法