Tag obbligatori non presenti quando si utilizza l'associazione guidata dati XML di Delphi


99

Sto usando XML Data Binding Wizardin Delphi XE2. Lo schema ha tag obbligatori di questo 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>

Il problema è che se non aggiungo alcun elemento, ad esempio, al Values-group, non ci sarà alcun <Values>-tag e il file XML fallirà la convalida rispetto al file XSD. Questo probabilmente non sarebbe un problema se l'interfaccia fornisse un metodo per "aggiungere" il Valuestag.

Esiste un modo standard per gestirlo o sto utilizzando il codice generato in modo non corretto?

In parole povere , c'è alcun modo, work-around o in altro modo, utilizzando il codice dal Data Binding Wizard, per produrre la seguente XML(che è ciò che è necessario per convalidare utilizzando lo schema di cui sopra, quando non ci sono i figli), dato HeaderType, ValuesTypee EventsTypesono di complexType :

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

(So ​​che ci sono altri problemi simili, come il codice generato <xs:sequence>non applicando l'ordine corretto nel XMLfile finale , ma almeno per quello, c'è una soluzione semplicemente inserendo i bambini nell'ordine giusto. Penso ancora sarebbe bello se Embarcaderofornisse un'interfaccia completa, che tenga conto di più di queste funzionalità.)


Hai già scoperto la radice del problema quando hai menzionato l'ordine. La classe generata è uno stupido involucro attorno al modello a oggetti XML; esisterà solo quando richiesto. Con i tipi di stringa questo è abbastanza facile (basta aggiungere una stringa vuota) ma per i tipi complessi non sono sicuro che nil funzionerà.
Leonardo Herrera

Questo in realtà non è del tutto vero. Il codice per TXMLValuesType.AfterConstructionlegge RegisterChildNode('Value', TXMLValueType); FValue := CreateCollection(TXMLValueTypeList, IXMLValueType, 'Value') as IXMLValueTypeList;quindi la raccolta di elementi di valore (sotto il tag Values ​​genitore), che è ciò che rende così difficile creare il tag Values ​​vuoto. La Value-list vuota ti impedirà di forzare SaveToFilea produrre il <Values />tag
Randomeister

3
@Randomeister - Prova l'attributo minOccurs = "1" nel tuo XSD: <xs: all maxOccurs = "1">. Inoltre, prova a utilizzare <xs: sequence> invece di <xs: all>. Ho lavorato molto con la procedura guidata di associazione (in Delphi XE) e non ho riscontrato alcun problema, ma devi assicurarti di dichiarare correttamente i tuoi tipi e attributi in modo che la procedura guidata comprenda l'ordine ei valori obbligatori.
Vettore

Risposte:


1

Non sono sicuro di capire ma forse quello che stai cercando è: 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>

Dimmi se va bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.