Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   XML-Datenbindungsexperte und Präfix (https://www.delphipraxis.net/165631-xml-datenbindungsexperte-und-praefix.html)

Keldorn 9. Jan 2012 16:52

XML-Datenbindungsexperte und Präfix
 
Hallo,

Als Alternative zu meinem anderen Thread möchte ich den XML-Datenbindungs-Experten probieren. War ja völlig an mir vorbeigegangen, daß der auf einmal in der PRO-Version schon dabei ist :-D.

Die xsd wird importiert und die pas erstellt, soweit ist alles ok. Erstellen oder Auslesen der XML geht schnell und übersichtlich, ein TRAUM :-D.
Der Aufruf sieht dann in etwa so aus:
Delphi-Quellcode:
  xmltest:=NewKnownTrackingRequest;

  xmltest.Request.ServiceHeader.SiteID  := LabeledEdit_SiteID.Text;
  //… usw
Trotzdem ist die daraus erstellte XML dann “nackig”, es fehlen die namespace definitionen und der Rootknoten ist auch ohne präfix.
Ich kann zwar den erstellten XML-string einem TXMLdocument zuweisen und dort analog die Attribute setzen,
Delphi-Quellcode:
  XMLDocument1.XML.text:=xmltest.xml;
  //…
  XMLDocument1.DocumentElement.Attributes['xmlns:req'] := 'http://www.XYZ.com';
  //…
Allerdings fehlt mir jegliche Idee (außer stringreplace ;-) ), wie ich dem rootknoten den Präfix hinzufüge.
Und außerdem kann es ja so nicht gewollt sein, das Erstellen der reinen XML-Struktur ist durch den wizzard so simpel und schnell und dann ...

Analog das Auslesen, ein zweites XML-file, was ausgelesen werden soll, sieht (gekürzt) so aus
XML-Code:
  <?xml version="1.0" encoding="UTF-8" ?>
- <req: TrackingResponse xmlns:req="http://www.XYZ.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.XYZ.com track-err-res.xsd">
- <Response>
- <ServiceHeader>
  <MessageTime>2012-01-09T17:00:16+01:00</MessageTime>
  </ServiceHeader>
  </Response>
  </req: TrackingResponse>
Delphi-Quellcode:
      XmlResponse := LoadTrackingResponse('D:\test_response.xml');
      ShowMessage(XmlResponse.Response.ServiceHeader.MessageTime);
Funktioniert nur, wenn ich vorher das “req:” vor Trackingresponse entferne.

Wie bekomme ich das Präfix hier dann wieder ohne stringreplace weg? Oder wie kann dieses XML mit Hilfe das Datenbindungsexperten ausgelesen werden?

Danke Frank

Keldorn 12. Jan 2012 08:37

AW: XML-Datenbindungsexperte und Präfix
 
Hallo,

*push* :duck:

Ich habe stundenlang noch weitergesucht, aber irgendwie nix passendes gefunden. Meistens bezieht sich alles aufs IXMLDocument2, nicht aufs IXMLDocument/TXMLDocument.

hier wird z.B. noch gezeigt, das man den erstellten Codes des XML-Datenbindungs-experten noch abändern soll.
Würde in meinem Fall nicht funktionieren, da der Praefix dann vor jedem Knoten steht, das mag die andere Seite nicht. Außerdem möchte ich das nicht unbedingt, würde man die xsd mal erneut importieren, wären ja alle Änderungen wieder weg und ich wüßte nicht, wie ich das sicher dokumentieren sollte.

Ist es wirklich die Lösung (?), daß man mit Stringreplace solange die XML """anpaßt""" bis es von der Gegenseite (Präfix zu Rootnode hinzufügen) oder von Delphi (also Prafix vor Rootnode weg) selbst, gelesen werden kann? Das kommt mir so schmutzig und umständlich vor ...

meine Lösung sieht aktuell so aus:
Delphi-Quellcode:
Function Func_XML_KnotenPraefixHinzufuegen(const QuellXML,Praefix,KnotenName:string):string;
//Fügt einen Präfix (inklusive Doppelpunkt, z.B. "reg:" vor den Nodenamen hinzu
  begin
    result:=QuellXML;
    result:=StringReplace(result,
                          '<'+KnotenName,
                          '<'+Praefix+':'+KnotenName,
                          [rfIgnoreCase,rfReplaceAll]);
    result:=StringReplace(result,
                          '</'+KnotenName,
                          '</'+Praefix+':'+KnotenName,
                          [rfIgnoreCase,rfReplaceAll]);
  end;

procedure Proc_XML_PraefixWurzelknotenHinzufuegen(XMLDocument:IXMLDocument;const Praefix:string);
Var NodeName:string;
begin
  if not(XMLDocument.Active) then
    XMLDocument.Active:=true;
  if XMLDocument.DocumentElement<>Nil then
    begin
      //Wurzelknoten auslesen
      NodeName:=XMLDocument.DocumentElement.NodeName;
      XMLDocument.XML.Text:=Func_XML_KnotenPraefixHinzufuegen(XMLDocument.XML.Text,
                                                              Praefix,
                                                              NodeName);
    end;
end;

procedure Proc_XML_PraefixWurzelknotenEntfernen(XMLDocument:IXMLDocument);
//Dient dazu, den Präfix "req" bei z.B. "req:TrackingRequest" zu entfernen
Var NodeName,NodeNameOhnePraefix:string;
begin
  if not(XMLDocument.Active) then
    XMLDocument.Active:=true;
  if XMLDocument.DocumentElement<>Nil then
    begin
      //Wurzelknoten auslesen
      NodeName:=XMLDocument.DocumentElement.NodeName;
      if pos(':',NodeName)>0 then
        begin
          NodeNameOhnePraefix:=NodeName;
          delete(NodeNameOhnePraefix,1,pos(':',NodeName));

          XMLDocument.XML.Text:=StringReplace(XMLDocument.XML.text,
                                NodeName,
                                NodeNameOhnePraefix,
                                [rfIgnoreCase,rfReplaceAll]);
        end;
    end;
end;
z.B. Aufruf beim Laden:
Delphi-Quellcode:
Var XmlTrackingResponse: IXMLTrackingResponse;

  //...
  FXMLDocument.XML.text:=response;
  Proc_XML_PraefixWurzelknotenEntfernen(FXMLDocument);
  XmlTrackingResponse := GetTrackingResponse(FXMLDocument);
Gruß Frank

stahli 12. Jan 2012 17:46

AW: XML-Datenbindungsexperte und Präfix
 
Ich habe meine Versuche mit XML als "Datenbank" für ein komplexes Projekt schnell aufgegeben.
Der Bindungsexperte hat mich zwar zuerst beeindruckt, letztlich war mir das aber dann zu unflexibel und unübersichtlich.
Außerdem gingen die verschiedenen Zugriffskomponenten (Objekte + Interfaces) sehr unterschiedlich mit leeren und fehlenden Knoten um.

Ich habe mir daher ein eigenes Format und Komponenten entwickelt, mit denen ich meine Datenobjekte serialisiere.

Also im Detail kann ich leider nicht helfen.

generic 12. Jan 2012 17:50

AW: XML-Datenbindungsexperte und Präfix
 
Was du suchst sind Namespaces und keine Prefixe.

Vielleicht hilft es beim Suchen, hab gerade keine Zeit eine Ref.Lösung zu bauen.

Keldorn 12. Jan 2012 19:37

AW: XML-Datenbindungsexperte und Präfix
 
Hallo, Danke für Eure Antworten :-).

@Stahli:
es würde sich nicht um ein Datenbankprojekt oder ähnliches handeln. Es geht um Erstellen und Auslesen von xml´s, die übers Internet verschickt werden (z.B. eine Sendungsverfolgung bei Kurierdienstleistern). Es ist dabei kein "richtiger" Soap-Webservice, wo eine wsdl existiert, sondern die xml´s müssen manuell erstellt werden.

Den XML-Datenbindung-experten finde ich schon recht nützlich. Ähnich wie beim Webservice kannst Du alles über die Codevervollständigung lösen und verfängst Dich nicht in irgendwelchen komplexen Strukturen oder in Groß/Kleinschreibung.

@generic:
ich habe das ja parallel versucht, manuell zu lösen, siehe. mein Problem ist halt, daß ich auch dort nicht in der Lage bin, den namespace beim TXMLdocument so anzugeben, daß der Rootknoten ein Präfix erhält und alle anderen Nodes nicht. Nur so wird das xml von der Gegenseite akzeptiert und verarbeitet.
Ich kann ja auch in dem erzeugten Source vom Datanbindungsexperten den leeren "Targetnamespace" ändern, führt aber nicht zum Erfolg.

Bisher dachte ich, xml ist was genormtes. Da kann es doch nicht sein, daß jedes Programm/Parser hier anderer Meinung ist, wie das xml auszusehen hat :roll:

Gruß Frank

madas 12. Jan 2012 21:08

AW: XML-Datenbindungsexperte und Präfix
 
Zitat:

Zitat von Keldorn (Beitrag 1145683)
ich habe das ja parallel versucht, manuell zu lösen, siehe. mein Problem ist halt, daß ich auch dort nicht in der Lage bin, den namespace beim TXMLdocument so anzugeben, daß der Rootknoten ein Präfix erhält und alle anderen Nodes nicht. Nur so wird das xml von der Gegenseite akzeptiert und verarbeitet.
Ich kann ja auch in dem erzeugten Source vom Datanbindungsexperten den leeren "Targetnamespace" ändern, führt aber nicht zum Erfolg.

dies hier:
Delphi-Quellcode:
var
  prefix, namespaceURI: String;
  newXML : IXMLDocument;
  root: IXMLNode;
begin
  prefix := 'prefix';
  namespaceURI := 'http://www.test.de';
  newXML := NewXMLDocument();
  newXML.Active := true;
  newXML.Version := '1.0';
  newXML.StandAlone := 'yes';
  newXML.Encoding := 'UTF-8';
  newXML.Options := [doNodeAutoCreate, doNodeAutoIndent, doAttrNull];

  root := newXML.AddChild(prefix + ':myRoot');
  root.DeclareNamespace(prefix, namespaceURI);
  root.AddChild('firstChild', EmptyStr);

  newXML.SaveToFile(pathToXML + 'test.xml');
end;
sollte das hier ergeben:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<prefix:myRoot xmlns:prefix="http://www.test.de">
  <firstChild/>
</prefix:myRoot>

Keldorn 13. Jan 2012 13:13

AW: XML-Datenbindungsexperte und Präfix
 
Hallo Madas,

ja genau, Danke:thumb:

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz