2012-10-01 8 views
82

Ich verwende den XML-Datenbindungsassistenten in Delphi XE2. Das Schema hat Tags dieses Typs benötigt:Erforderliche Tags bei Verwendung des XML-Datenbindungs-Assistenten von Delphi nicht vorhanden

<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 hinzufügen, keine Elemente z.B. In der Values-Gruppe gibt es kein <Values> -Tag, und die XML-Datei wird die Validierung gegen die XSD nicht bestehen. Dies wäre wahrscheinlich kein Problem, wenn die Schnittstelle eine Methode zum "Hinzufügen" des Values-Tags bereitstellen würde.

Gibt es eine Standardbehandlung, oder verwende ich den generierten Code korrekt?

Einfach gesagt gibt es jede Art und Weise, Work-around oder auf andere Weise, den Code aus dem Daten unter Verwendung von Wizard Binding, das folgende XML, um (das ist, was benötigt wird, unter Verwendung des obigen Schema zu validieren es, wenn sind keine untergeordneten Knoten), gegeben HeaderType, ValuesType und EventsType von complex sind:

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

(ich weiß, andere ähnliche Fragen gibt es, wie erzeugt der Code durch <xs:sequence> die richtige Reihenfolge in der letzten XML-Datei nicht erzwingen, Aber zumindest für diesen Fall gibt es einen Workaround, indem man einfach die Kinder in die richtige Reihenfolge bringt denke, es wäre schön, wenn Embarcadero eine vollständige Schnittstelle zur Verfügung stellen würde, die mehrere dieser Merkmale berücksichtigt)

+0

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 man darum gebeten wird. Bei String-Typen ist das einfach genug (füge einfach einen leeren String hinzu), aber bei komplexen Typen bin ich mir nicht sicher, ob nil funktionieren wird. –

+0

Das ist eigentlich nicht ganz richtig. Der Code für 'TXMLValuesType.AfterConstruction' lautet ' RegisterChildNode ('Value', TXMLValueType); FValue: = CreateCollection (TXMLValueTypeList, IXMLValueType, 'Value') als IXMLValueTypeList; ' also die Sammlung von Value-Elementen (unter dem übergeordneten Values-Tag) existiert, was es so schwer macht, das leere Values-Tag zu erstellen . Die leere Werteliste wird Sie effektiv davon abhalten, 'SaveToFile' zu ​​zwingen, den' ' -tag – Randomeister

+1

@Randomeister zu erzeugen. Versuchen Sie das minOccurs = "1" Attribut in Ihrer XSD: \t . Versuchen Sie auch, anstelle von zu verwenden. Ich habe mit dem Bindungsassistenten (in Delphi XE) viel gearbeitet und keine Probleme festgestellt. Sie müssen jedoch sicherstellen, dass Sie Ihre Typen und Attribute korrekt deklarieren, damit der Assistent die Reihenfolge und die verbindlichen Werte versteht. – Vector

Antwort

1

Nicht sicher zu verstehen, aber vielleicht, was Sie suchen ist. verwenden = „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, wenn es in Ordnung ist.

+0

bis. Ist es das, wonach du gesucht hast? – Hans

Verwandte Themen