So, ich will den Thread damit schliessen, dass ich kurz über die Fallstricke, und wie ich sie gelöst habe, schreibe, damit andere auch eine zufriedenstellende Lösung finden können.
Ich habe, wie gesagt wurde, den
XML Data Binding Wizard genutzt, um die
XML Datei einzulesen. Diese nutzte Namespaces, die natürlich nicht eingelesen wurden.
Nodes wie dieser
Code:
<bmecat:NAME2>Nebenstelle 2</bmecat:NAME2>
wurden zwar eingefügt, aber ohne "bmecat" Namespace.
Ich habe dazu die erzeugten Klassen erweitert :
Delphi-Quellcode:
function TXMLADDRESSType.Get_NAME2: UnicodeString;
begin
Result := ChildNodes['bmecat:NAME2'].Text;
end;
procedure TXMLADDRESSType.Set_NAME2(const Value: UnicodeString);
begin
if Value <> EmptyStr then
ChildNodes['bmecat:NAME2'].NodeValue := Value;
end;
Dazu musste der Namespace aber entsprechend registriert werden, dies habe ich dann in der erstellen Funktion NewORDER gemacht (der Name kann bei anderen Klassen abweichen, ORDER war in meinem Fall der Rootnode.
Delphi-Quellcode:
function NewORDER: IXMLORDERType;
begin
Result := NewXMLDocument.GetDocBinding('ORDER', TXMLORDERType, TargetNamespace) as IXMLORDERType;
Result.Version := '2.1';
Result.DeclareNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance'); // von mir hinzugefügt
Result.DeclareNamespace('xsd', 'http://www.w3.org/2001/XMLSchema'); // von mir hinzugefügt
Result.DeclareNamespace('bmecat', 'http://www.bmecat.org/bmecat/2005'); // von mir hinzugefügt
end;
Jetzt gab es noch einen weiteren Fallstrick und zwar die Attribute in Verbindung mit Namespaces, wie hier :
Code:
<bmecat:PARTY_ID type="supplier_specific">0000055905</bmecat:PARTY_ID>
Dazu musste zum einen im erzeugten Delphi Code, wo der Node erzeugt wird, eine Änderung gemacht werden :
Delphi-Quellcode:
procedure TXMLPARTYType.AfterConstruction;
begin
RegisterChildNode('bmecat:PARTY_ID', TXMLPARTY_IDType, 'http://www.bmecat.org/bmecat/2005');
inherited;
end;
function TXMLPARTYType.Get_PARTY_ID: IXMLPARTY_IDType;
begin
Result := ChildNodes['bmecat:PARTY_ID'] as IXMLPARTY_IDType;
end;
Dort wurde zum einen vor PARTY_ID jeweils "bmecat:" hinzugefügt, zum anderen aber auch in RegisterChildNode noch der 3. Parameter mit der bmecat-
URL angegefügt.
Beim Beschreiben des Nodes wurde dann aber anstelle der einfachen Zuweisung wie
Delphi-Quellcode:
var
lParty: IXMLPARTYType;
begin
lParty := FXMLOrder.ORDER_HEADER.ORDER_INFO.PARTIES.Add;
lParty.ADDRESS.NAME2 := AName2;
end;
dann der Node eher händisch erzeugt
Delphi-Quellcode:
var
lParty: IXMLPARTYType;
lNode: IXMLNode;
begin
lParty := FXMLOrder.ORDER_HEADER.ORDER_INFO.PARTIES.Add;
lNode := lParty.PARTY_ID;
lNode.Attributes['type'] := ATTR_SUPPLIER_SPECIFIC;
lNode.Text := ASupplierId;
end;
Beim Einlesen eines
XML in die ereugten Objecte gibt es keine Probleme, aber falls man ein komplett neues
XML-Dokument in diesem Standard erzeugen will muss man diese Umwege scheinbar gehen. Ist nicht so schlimm, muss man nur wissen
Ich hoffe es hilft, zu dem Thema auch eine abschliessende Lösung zu haben...