Tags obrigatórias não estão presentes ao usar Delphi XML Data Binding Wizard

99

Estou usando o XML Data Binding Wizardem Delphi XE2. O esquema requer tags deste tipo:

<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>

O problema é que se eu não adicionar nenhum elemento, por exemplo, ao Values-group, não haverá <Values>-tag e o arquivo XML falhará na validação do XSD. Isso provavelmente não seria um problema se a interface estivesse fornecendo um método para "adicionar" a Values-tag.

Existe uma maneira padrão de lidar com isso ou estou usando o código gerado incorretamente?

Simplificando , há qualquer forma, o trabalho-around ou de outra forma, usando o código da Data Binding Wizard, para produzir o seguinte XML(que é o que é necessário para validar usando o esquema acima, quando não há nós filhos), dada HeaderType, ValuesTypee EventsTypesão de complexType :

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

(Eu sei que há outros problemas semelhantes, como o código gerado por <xs:sequence>não impor a ordem correta no XML-file final , mas pelo menos para aquele, há uma solução alternativa simplesmente inserindo os filhos na ordem certa. Ainda acho seria bom se Embarcaderofornecesse uma interface completa, que levasse mais desses recursos em consideração.)

Randomeister
fonte
Você já descobriu a raiz do problema quando mencionou o pedido. A classe gerada é um invólucro burro em torno do modelo de objeto XML; ele só existirá quando solicitado. Com tipos de string, isso é fácil (basta adicionar uma string vazia), mas para tipos complexos, não tenho certeza se nil funcionará.
Leonardo Herrera
Na verdade, isso não é bem verdade. O código para TXMLValuesType.AfterConstructionRegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;para que a coleção de itens-valor (sob a tag-valores-pai) exista, o que torna tão difícil criar a tag-Values ​​vazia. A lista de valores vazia impedirá você de forçar SaveToFilea produção da <Values />-tag
Randomeister
3
@Randomeister - Experimente o atributo minOccurs = "1" em seu XSD: <xs: all maxOccurs = "1">. Além disso, tente usar <xs: sequence> em vez de <xs: all>. Trabalhei muito com o assistente de vinculação (no Delphi XE) e não encontrei nenhum problema - mas você deve certificar-se de declarar seus tipos e atributos corretamente para que o assistente entenda a ordem e os valores obrigatórios.
Vetor de

Respostas:

1

Não tenho certeza de entender, mas talvez o que você esteja procurando seja: 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>

Me diga se está tudo bem.

Hans
fonte