AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML XML-Datenbindungsexperte und Präfix
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Datenbindungsexperte und Präfix

Ein Thema von Keldorn · begonnen am 9. Jan 2012 · letzter Beitrag vom 13. Jan 2012
Antwort Antwort
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

XML-Datenbindungsexperte und Präfix

  Alt 9. Jan 2012, 17:52
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 .

Die xsd wird importiert und die pas erstellt, soweit ist alles ok. Erstellen oder Auslesen der XML geht schnell und übersichtlich, ein TRAUM .
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: XML-Datenbindungsexperte und Präfix

  Alt 12. Jan 2012, 09:37
Hallo,

*push*

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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: XML-Datenbindungsexperte und Präfix

  Alt 12. Jan 2012, 18:46
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#4

AW: XML-Datenbindungsexperte und Präfix

  Alt 12. Jan 2012, 18:50
Was du suchst sind Namespaces und keine Prefixe.

Vielleicht hilft es beim Suchen, hab gerade keine Zeit eine Ref.Lösung zu bauen.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: XML-Datenbindungsexperte und Präfix

  Alt 12. Jan 2012, 20:37
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

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#6

AW: XML-Datenbindungsexperte und Präfix

  Alt 12. Jan 2012, 22:08
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>

Geändert von madas (12. Jan 2012 um 22:12 Uhr)
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: XML-Datenbindungsexperte und Präfix

  Alt 13. Jan 2012, 14:13
Hallo Madas,

ja genau, Danke

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz