使用Delphi XML数据绑定向导时缺少必需的标签。

99

我正在使用Delphi XE2中的XML数据绑定向导(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组添加任何元素,则不会出现<Values>标记,而XML文件将无法通过对XSD的验证。如果该接口提供了“添加”Values标记的方法,则可能不会有问题。
处理这个问题是否有标准化的方法,或者我是否不正确地使用了生成的代码?
简而言之,是否有任何方法、变通方法或其他方式,使用来自Data Binding Wizard的代码,以产生以下XML(当没有子节点时需要验证使用上述模式),假设HeaderTypeValuesTypeEventsType都是complexType类型:
<MyReport>
  <Header />
  <Values />
  <Events />
</MyReport> 

(我知道还有其他类似的问题,比如由<xs:sequence>生成的代码不能强制执行最终XML文件中的正确顺序,但至少对于这个问题,可以通过简单地按正确顺序插入子元素来解决。我仍然认为如果Embarcadero提供一个完整的界面,考虑到更多这些特征将是不错的。)


当提到排序时,您已经发现了问题的根源。生成的类是对XML对象模型的简单包装器;只有在被要求时才存在。对于字符串类型,这很容易(只需添加一个空字符串),但是对于复杂类型,我不确定nil是否有效。 - Leonardo Herrera
这实际上并不完全正确。TXMLValuesType.AfterConstruction 的代码如下:RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;因此,值项的集合(在父 Values 标记下)存在,这就是使得创建空的 Values 标记变得如此困难的原因。空的 Value 列表将有效地阻止您强制 SaveToFile 生成 <Values /> 标记。 - Randomeister
3
尝试在你的XSD中使用minOccurs="1"属性:<xs:all maxOccurs="1">。另外,尝试使用xs:sequence而不是xs:all。我已经在Delphi XE中使用过绑定向导,并没有遇到任何问题 - 但你必须确保正确声明你的类型和属性,让向导理解顺序和必填值。 - Vector
1个回答

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>

告诉我这样是否可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接