Balises requises non présentes lors de l'utilisation de l'assistant de liaison de données XML Delphi

99

J'utilise le XML Data Binding Wizardin Delphi XE2. Le schéma a requis des balises de ce type:

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

Le problème est que si je n'ajoute aucun élément, par exemple au Values-group, il n'y aura pas de <Values>-tag, et le fichier XML échouera à la validation par rapport au XSD. Ce ne serait probablement pas un problème si l'interface fournissait une méthode pour "ajouter" le Values-tag.

Existe-t-il un moyen standard de gérer cela ou est-ce que j'utilise le code généré correctement?

En termes simples , existe-t-il un moyen, de contournement ou autre, en utilisant le code du Data Binding Wizard, pour produire ce qui suit XML(ce qui est nécessaire pour valider à l'aide du schéma ci-dessus lorsqu'il n'y a pas de nœuds enfants), étant donné HeaderType, ValuesTypeet EventsTypesont de type complexe :

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

(Je sais qu'il y a d'autres problèmes similaires, comme le code généré en n'appliquant <xs:sequence>pas le bon ordre dans le XMLfichier final , mais au moins pour celui-là, il y a une solution en insérant simplement les enfants dans le bon ordre. Je pense toujours ce serait bien de Embarcaderofournir une interface complète, qui prend en compte davantage de ces fonctionnalités.)

Randomeister
la source
Vous avez déjà découvert la racine du problème lors de la commande. La classe générée est un wrapper stupide autour du modèle d'objet XML; il n'existera que sur demande. Avec les types de chaîne, c'est assez facile (ajoutez simplement une chaîne vide) mais pour les types complexes, je ne suis pas sûr que nil fonctionnera.
Leonardo Herrera
Ce n'est en fait pas tout à fait vrai. Le code pour les TXMLValuesType.AfterConstructionlectures de RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;sorte que la collection d'éléments de valeur (sous la balise Values ​​parent) existe, ce qui rend si difficile la création de la balise Values ​​vide. La liste de valeurs vide vous empêchera effectivement de forcer SaveToFileà produire le <Values />-tag
Randomeister
3
@Randomeister - Essayez l'attribut minOccurs = "1" dans votre XSD: <xs: all maxOccurs = "1">. Essayez également d'utiliser <xs: sequence> au lieu de <xs: all>. J'ai beaucoup travaillé avec l'assistant de liaison (dans Delphi XE) et je n'ai rencontré aucun problème - mais vous devez vous assurer que vous déclarez correctement vos types et attributs afin que l'assistant comprenne l'ordre et les valeurs obligatoires.
Vecteur

Réponses:

1

Je ne suis pas sûr de comprendre, mais peut-être que ce que vous recherchez est: 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>

Dis-moi si ça va.

Hans
la source