![]() |
XML-Datenbindungsexperte und Präfix
Hallo,
Als Alternative zu ![]() 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:
Trotzdem ist die daraus erstellte XML dann “nackig”, es fehlen die namespace definitionen und der Rootknoten ist auch ohne präfix.
xmltest:=NewKnownTrackingRequest;
xmltest.Request.ServiceHeader.SiteID := LabeledEdit_SiteID.Text; //… usw Ich kann zwar den erstellten XML-string einem TXMLdocument zuweisen und dort analog die Attribute setzen,
Delphi-Quellcode:
Allerdings fehlt mir jegliche Idee (außer stringreplace ;-) ), wie ich dem rootknoten den Präfix hinzufüge.
XMLDocument1.XML.text:=xmltest.xml;
//… XMLDocument1.DocumentElement.Attributes['xmlns:req'] := 'http://www.XYZ.com'; //… 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:
Funktioniert nur, wenn ich vorher das “req:” vor Trackingresponse entferne.
XmlResponse := LoadTrackingResponse('D:\test_response.xml');
ShowMessage(XmlResponse.Response.ServiceHeader.MessageTime); 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 |
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. ![]() 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:
z.B. Aufruf beim Laden:
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;
Delphi-Quellcode:
Gruß Frank
Var XmlTrackingResponse: IXMLTrackingResponse;
//... FXMLDocument.XML.text:=response; Proc_XML_PraefixWurzelknotenEntfernen(FXMLDocument); XmlTrackingResponse := GetTrackingResponse(FXMLDocument); |
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. |
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. |
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, ![]() 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 |
AW: XML-Datenbindungsexperte und Präfix
Zitat:
Delphi-Quellcode:
sollte das hier ergeben:
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;
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<prefix:myRoot xmlns:prefix="http://www.test.de"> <firstChild/> </prefix:myRoot> |
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