XML डेटा बाध्यकारी विज़ार्ड और एकाधिक नामस्थानों का उपयोग करना



delphi xsd (0)

एक्सएसडी फाइलों के दिए गए सेट के लिए इंटरफेस बनाने के लिए मैं डेल्फी सिएटल में XML डेटा बाध्यकारी विज़ार्ड का उपयोग करने की कोशिश कर रहा हूं। मुझे पता है कि XML विज़ार्ड में कई नामस्थानों का उपयोग करने में समस्याएं हैं, लेकिन मैं खुद को सटीक समस्या / समाधान समझने के लिए 'प्राप्त नहीं कर सकता ....

आपको व्यापक विवरण प्रदान करने से पहले, मेरा प्रश्न संक्षिप्त रूप में है: जेनरेट किए गए कोड को यह नाम-स्थान उपसर्गों को परिभाषित करने के लिए कैसे करें जो परिणामस्वरूप XML में अलग हैं क्योंकि वे XSD परिभाषा में हैं?

एक्सएसडी जो कोड से उत्पन्न होता है, निम्नानुसार हैं

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

यह XSD निम्नलिखित सामग्री के साथ datastructures नाम स्थान को संदर्भित करता है:

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

नोट: यह XSD अन्य basetypes को simpletypes basetypes और simpletypes basetypes संदर्भ simpletypes लेकिन ये simpletypes में प्रयोग नहीं किया जाता है जो यहां समस्या है

उत्पन्न कोड इस तरह दिखता है (दिखाए गए केवल प्रासंगिक भाग)

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.

REST सेवा मुझे निम्न उत्तर 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>

जब मैं GetApplicationInstanceRegistrationResponse(XML) कुंजी या गुप्त के मूल्य को प्राप्त करने की कोशिश कर रहा है, तो एक उदाहरण OLEVariant त्रुटि देता है क्योंकि ChildNodes['key'] में ChildNodes['key'] कथन नोड नहीं मिल सकता है। जब मैं ChildNodes['ns5:key'] करता है तो यह काम करता है लेकिन ns5 एक निश्चित नेमस्पेस उपसर्ग नहीं है

मैंने पहले ही स्वीकार कर लिया है कि विज़ार्ड द्वारा उत्पन्न कोड को मैन्युअल रूप से बदलना होगा, क्योंकि नेट पर व्यापक खोज ने मुझे विज़ार्ड परिणामों को ठीक करने पर कोई संरचनात्मक समाधान प्रदान नहीं किया था।

तो मैं इसे कैसे ठीक कर सकता हूं और TXMLAppInstanceRegistrationType_rmrds जागरूक कर सकता हूं कि इसके तत्वों को datastructure schema में परिभाषित किया गया है?





xml-parsing