使用Delphi XML数据绑定向导时不存在必需的标签


99

我正在使用XML Data Binding Wizardin 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(这是使用上述模式时,有没有子节点需要什么来验证),给出HeaderTypeValuesTypeEventsType有复杂类型的:

<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,2012年

3
@Randomeister-尝试在您的XSD中使用minOccurs =“ 1”属性:<xs:all maxOccurs =“ 1”>。另外,尝试使用<xs:sequence>代替<xs:all>。我已经使用绑定向导(在Delphi XE中)进行了很好的处理,并且没有遇到任何问题-但是您必须确保正确声明类型和属性,以便向导可以理解顺序和必需值。
矢量

Answers:


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>

告诉我是否可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.