tra - xml valido



Procedura guidata di associazione dati XML e utilizzo di più spazi dei nomi (0)

Sto cercando di utilizzare la procedura guidata di associazione dati XML in Delphi Seattle per generare interfacce per un determinato set di file XSD. So che ci sono problemi con l'utilizzo di più spazi dei nomi nella procedura guidata XML, ma non riesco a capire da me stesso il problema / soluzione esatta ....

Prima di fornirti i dettagli completi, in breve la mia domanda è: come modificare il codice generato per farlo interpretare prefissi dello spazio dei nomi che sono diversi nell'XML risultante così come sono nella definizione XSD?

Gli XSD da cui viene generato il codice sono i seguenti

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="application/registration/2014/04" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:rmrds="datamodel/canonical/datastructures/2014/01/">

    <import schemaLocation="CanonicalDataModel/CanonicalDataModel_DataStructures.xsd" namespace="datamodel/canonical/datastructures/2014/01/">
    </import>

    <element name="ApplicationInstanceRegistrationResponse">
        <complexType>
            <sequence>
                <element name="registrationResponse" type="rmrds:AppInstanceRegistrationType" />
            </sequence>
        </complexType>
    </element>
</schema>

Questo XSD fa riferimento allo spazio dei nomi delle strutture dati con i seguenti contenuti:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="datamodel/canonical/datastructures/2014/01/"
    xmlns:rmrds="datamodel/canonical/datastructures/2014/01/" elementFormDefault="qualified"
    xmlns:rmrbt="datamodel/canonical/basetypes/2014/01/" xmlns:rmrst="datamodel/canonical/simpletypes/2014/01/">

    <import schemaLocation="CanonicalDataModel_BaseTypes.xsd" namespace="datamodel/canonical/basetypes/2014/01/" />
    <import schemaLocation="CanonicalDataModel_SimpleTypes.xsd" namespace="datamodel/canonical/simpletypes/2014/01/" />

    <complexType name="AppInstanceRegistrationType">
        <sequence>
            <element name="key" type="string" />
            <element name="secret" type="string" />
        </sequence>
    </complexType>
</schema>

Nota: questo XSD fa riferimento ad altri basetypes e simpletypes XSD simili, ma questi non sono usati nell'elemento ApplicationregistrationType che è il problema qui

Il codice generato appare come questo (solo le parti rilevanti mostrate)

type

  IXMLApplicationInstanceRegistrationResponse = interface;
  IXMLAppInstanceRegistrationType_rmrds = interface;

  IXMLApplicationInstanceRegistrationResponse = interface(IXMLNode)
    ['{045B5E7C-83E2-4DB3-B7CD-7C2C28E0E387}']
    { Property Accessors }
    function Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
    { Methods & Properties }
    property RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds read Get_RegistrationResponse;
  end;

  IXMLAppInstanceRegistrationType_rmrds = interface(IXMLNode)
    ['{2C1869A9-8B9E-4EC1-9320-5F6683BCB20E}']
    { Property Accessors }
    function Get_Key: String;
    function Get_Secret: String;
    procedure Set_Key(Value: String);
    procedure Set_Secret(Value: String);
    { Methods & Properties }
    property Key: String read Get_Key write Set_Key;
    property Secret: String read Get_Secret write Set_Secret;
  end;

  TXMLApplicationInstanceRegistrationResponse = class;
  TXMLAppInstanceRegistrationType_rmrds = class;

  TXMLApplicationInstanceRegistrationResponse = class(TXMLNode, IXMLApplicationInstanceRegistrationResponse)
  protected
    { IXMLApplicationInstanceRegistrationResponse }
    function Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLAppInstanceRegistrationType_rmrds }

  TXMLAppInstanceRegistrationType_rmrds = class(TXMLNode, IXMLAppInstanceRegistrationType_rmrds)
  protected
    { IXMLAppInstanceRegistrationType_rmrds }
    function Get_Key: String;
    function Get_Secret: String;
    procedure Set_Key(Value: String);
    procedure Set_Secret(Value: String);
  end;

{ Global Functions }

function GetApplicationInstanceRegistrationResponse(Doc: IXMLDocument): IXMLApplicationInstanceRegistrationResponse;
function LoadApplicationInstanceRegistrationResponse(const FileName: string): IXMLApplicationInstanceRegistrationResponse;
function NewApplicationInstanceRegistrationResponse: IXMLApplicationInstanceRegistrationResponse;

const
  TargetNamespace = 'application/registration/2014/04';

implementation

{ Global Functions }

function GetApplicationInstanceRegistrationResponse(Doc: IXMLDocument): IXMLApplicationInstanceRegistrationResponse;
begin
  Result := Doc.GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

function LoadApplicationInstanceRegistrationResponse(const FileName: string): IXMLApplicationInstanceRegistrationResponse;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

function NewApplicationInstanceRegistrationResponse: IXMLApplicationInstanceRegistrationResponse;
begin
  Result := NewXMLDocument.GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

{ TXMLApplicationInstanceRegistrationResponse }

procedure TXMLApplicationInstanceRegistrationResponse.AfterConstruction;
begin
  RegisterChildNode('registrationResponse', TXMLAppInstanceRegistrationType_rmrds);
  inherited;
end;

function TXMLApplicationInstanceRegistrationResponse.Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
begin
  Result := ChildNodes['registrationResponse'] as IXMLAppInstanceRegistrationType_rmrds;
end;

{ TXMLAppInstanceRegistrationType_rmrds }

function TXMLAppInstanceRegistrationType_rmrds.Get_Key: String;
begin
  Result := ChildNodes['key'].NodeValue;
end;

procedure TXMLAppInstanceRegistrationType_rmrds.Set_Key(Value: String);
begin
  ChildNodes['key'].NodeValue := Value;
end;

function TXMLAppInstanceRegistrationType_rmrds.Get_Secret: String;
begin
  Result := ChildNodes['secret'].NodeValue;
end;

procedure TXMLAppInstanceRegistrationType_rmrds.Set_Secret(Value: String);
begin
  ChildNodes['secret'].NodeValue := Value;
end;
end.

Il servizio REST mi fornisce la seguente risposta XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns10:ApplicationInstanceRegistrationResponse 
   xmlns="datamodel/financial/modelobjects/2014/01/"
   xmlns:ns3="canonical/basetypes/2014/01/"
   xmlns:ns5="datamodel/canonical/datastructures/2014/01/"
   xmlns:ns6="datamodel/canonical/simpletypes/2014/01/" 
   xmlns:ns10="application/registration/2014/04" 

  <ns10:registrationResponse>
    <ns5:key>cac7bacc</ns5:key>
    <ns5:secret>NzY2MDkwNzliNjJkZTE1MWRjNGViNTI4MTk4MmZjZDkzYzhmY2UwNDA5YmJhMjlhYzVlY2JjZGFmNWE1NDg2OA==</ns5:secret>
  </ns10:registrationResponse>
</ns10:ApplicationInstanceRegistrationResponse>

Quando creo un'istanza con GetApplicationInstanceRegistrationResponse(XML) cercando di ottenere il valore di Key o Secret restituisce un errore OLEVariant, poiché l' ChildNodes['key'] di TXMLAppInstanceRegistrationType_rmrds.Get_Key in TXMLAppInstanceRegistrationType_rmrds.Get_Key non riesce a trovare il nodo. Quando uso ChildNodes['ns5:key'] funziona ma l' ns5 non è un prefisso dello spazio dei nomi fisso.

Ho già accettato che il codice generato dalla procedura guidata debba essere modificato manualmente, poiché un'estesa ricerca in rete non mi ha fornito alcuna soluzione strutturale sulla risoluzione dei risultati della procedura guidata.

Quindi, come posso risolvere questo problema e rendere la TXMLAppInstanceRegistrationType_rmrds consapevole del fatto che i suoi elementi sono definiti nello schema del datastructure ?





xml-parsing