2015-04-27 10 views
7

Sto lavorando a un progetto che riguarda un back-end Java con front-end Delphi. Sto tentando di generare associazioni XML basate su un file .xsd in java. L'XSD contiene un oggetto chiamato TaskList che ha item Tasks. Task è un elenco di attività. Quando creo i collegamenti XML Delphi tenta una funzione CreateCollection() utilizzando TXMLTaskList ma genera un errore perché TXMLTaskList è IXMLNode invece di IXMLNodeCollection.Il file di generazione dei bind XML non viene compilato

Sono ancora nuovo nell'usare i file XSD e la funzione di generazione dei bind XML, ma sulla base di quel poco che capisco stavo assumendo poiché TaskList contiene un singolo oggetto Task che non dovrebbe essere utilizzato nella funzione CreateCollection, Penserei che i compiti che è una lista di attività dovrebbero essere usati.

Questa è la linea che il mio file di binding XML sta gettando un errore:

FExportOnClientChange := CreateCollection(TXMLTaskList, IXMLTask, 
    'exportOnClientChange') as IXMLTaskList; 

Questo è il mio TXMLTaskLisk, dimostrando che si tratta di un TXMLNode invece di TXMLNodeCollectionClass che CreateCollection sta cercando.

type 
    TXMLTaskList = class(TXMLNode, IXMLTaskList) 
    protected 
    { IXMLTaskList } 
    function Get_Tasks: IXMLTasks; 
    public 
    procedure AfterConstruction; override; 
    end; 

Nei miei tentativi di capire il problema che ho notato che se faccio TaskList una lista illimitata di compiti e lasciare i compiti come una lista illimitata di compiti che tutto genera bene nel file Delphi XML, ma che avrebbe significa che ho una lista di una lista che non è quello che sto volendo.

Una cosa che potrebbe essere difficile dire qui è che TaskList e le attività sono in diversi file XSD anche se sono collegati.

<complexType name="TaskList"> 
    <sequence> 
     <element name="tasks" type="struct:tasks"></element> 
    </sequence> 
</complexType> 


<complexType name="tasks"> 
    <sequence> 
     <element ref="struct:task" maxOccurs="unbounded" minOccurs="0"></element> 
    </sequence> 
</complexType> 

risposta

0

Sei da solo nel dipartimento Delphi.

Con ciò detto, io uso i file xjc e xsd per generare classi Java.

Sembra che tu abbia incluso nella tua domanda un esempio di xsd che sai essere sbagliato. Nel tuo esempio xsd hai una sequenza di sequenze - mi aspetterei che il tuo esempio generi una classe con una collezione di collezioni di oggetti task.

Se ho compreso correttamente la tua domanda, ciò che vuoi è che TaskList contenga una raccolta di attività. Questo non dovrebbe essere troppo difficile. Che cosa hai provato?

Ecco un esempio di come genero un oggetto soglie che contiene un elenco di singoli oggetti Soglia:

<xsd:element name="Thresholds" type="ThresholdsType"/> 
<xsd:complexType name ="ThresholdsType"> 
    <xsd:sequence> 
     <xsd:element ref="Threshold" maxOccurs="unbounded" minOccurs="0"/> 
    </xsd:sequence> 
    <xsd:attribute name="interpolate" type="xsd:string" use="optional" /> 
    <xsd:attribute name="parameter" type="xsd:string" use="optional" /> 
    <xsd:attribute name="unitSystem" type="xsd:string" use="optional" /> 
</xsd:complexType> 

<xsd:element name="Threshold" type="ThresholdType"/> 
<xsd:complexType name="ThresholdType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute type="xsd:string" name="id" use="optional"/> 
      <xsd:attribute type="xsd:double" name="minInclusive" use="optional"/> 
      <xsd:attribute type="xsd:double" name="maxExclusive" use="optional"/> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

Ecco l'inizio della classe ThresholdsType Java generato:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ThresholdsType", propOrder = { 
    "threshold" 
}) 
@javax.xml.bind.annotation.XmlRootElement(name="ThresholdsType implements Cloneable, Named, Visitable, CopyTo, Equals, HashCode, ToString") 
public class ThresholdsType implements Cloneable, Named, Visitable, CopyTo, Equals, HashCode, ToString 
{ 

    @XmlElement(name = "Threshold") 
    protected List<ThresholdType> threshold; 
    @XmlAttribute(name = "interpolate") 
    protected String interpolate; 
    @XmlAttribute(name = "parameter") 
    protected String parameter; 
    @XmlAttribute(name = "unitSystem") 
    protected String unitSystem; 
    @XmlTransient 
    private QName jaxbElementName; 
    ... 

I avrebbe dovuto rinominare il campo "soglia" all'interno di ThresholdsType in "thresholds" ma a parte questo funziona benissimo.

Non funziona?

<complexType name="TaskList"> 
    <sequence> 
    <element ref="struct:task" maxOccurs="unbounded" minOccurs="0"/> 
    </sequence> 
</complexType>