Erforderliche Tags sind bei Verwendung des Delphi XML-Datenbindungsassistenten nicht vorhanden

99

Ich benutze das XML Data Binding Wizardin Delphi XE2. Für das Schema sind Tags dieses Typs erforderlich:

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

Das Problem ist, dass, wenn ich zB der -group keine Elemente hinzufüge Values, es kein <Values>-tag gibt und die XML-Datei die Validierung gegen die nicht besteht XSD. Dies wäre wahrscheinlich kein Problem, wenn die Schnittstelle eine Methode zum "Hinzufügen" des Values-tags bereitstellen würde.

Gibt es eine Standardmethode, um damit umzugehen, oder verwende ich den generierten Code falsch?

Einfach ausgedrückt , gibt es eine Möglichkeit, das Problem zu umgehen oder auf andere Weise, indem der Code aus dem verwendet Data Binding Wizardwird, um Folgendes zu erzeugen XML(was zur Validierung unter Verwendung des obigen Schemas erforderlich ist, wenn keine untergeordneten Knoten vorhanden sind) HeaderType, ValuesTypeund EventsTypesind vom Typ complexType ::

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

(Ich weiß, dass es andere ähnliche Probleme gibt, wie den Code, der generiert wird, wenn <xs:sequence>nicht die richtige Reihenfolge in der endgültigen XMLDatei erzwungen wird, aber zumindest für diese gibt es eine Problemumgehung, indem die Kinder einfach in der richtigen Reihenfolge eingefügt werden. Ich denke immer noch Es wäre schön, wenn Sie Embarcaderoeine vollständige Benutzeroberfläche bereitstellen würden, die mehr dieser Funktionen berücksichtigt.)

Randomeister
quelle
Sie haben die Ursache des Problems bereits bei der Bestellung entdeckt. Die generierte Klasse ist ein dummer Wrapper um das XML-Objektmodell. es wird nur existieren, wenn Sie dazu aufgefordert werden. Bei Zeichenfolgentypen ist dies einfach genug (fügen Sie einfach eine leere Zeichenfolge hinzu), aber bei komplexen Typen bin ich mir nicht sicher, ob nil funktioniert.
Leonardo Herrera
Das ist eigentlich nicht ganz richtig. Der Code zum TXMLValuesType.AfterConstructionLesen, RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;damit die Sammlung von Wertelementen (unter dem übergeordneten Values-Tag) vorhanden ist, macht es so schwierig, das leere Values-Tag zu erstellen. Die leere Wert-Liste werden Sie effektiv verhindert , zwingt SaveToFiledas zu produzieren <Values />-tag
Randomeister
3
@Randomeister - Probieren Sie das Attribut minOccurs = "1" in Ihrer XSD aus: <xs: all maxOccurs = "1">. Versuchen Sie auch, <xs: sequence> anstelle von <xs: all> zu verwenden. Ich habe viel mit dem Bindungsassistenten (in Delphi XE) gearbeitet und bin auf keine Probleme gestoßen. Sie müssen jedoch sicherstellen, dass Sie Ihre Typen und Attribute korrekt deklarieren, damit der Assistent die Reihenfolge und die obligatorischen Werte versteht.
Vektor

Antworten:

1

Ich bin mir nicht sicher, ob ich das verstehe, aber vielleicht suchen Sie nach: 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>

Sag mir, ob es in Ordnung ist.

Hans
quelle