Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Soap Request bearbeiten (https://www.delphipraxis.net/167725-soap-request-bearbeiten.html)

Lemmy 15. Apr 2012 00:04

Soap Request bearbeiten
 
Hallo,

ich versuche einen SoupRequest im HttpRioBeforeExec zu bearbeiten. Allerdings klappt das ganze nicht wie gewünscht:

Wenn ich so was mache:

Delphi-Quellcode:
  oXML:=TXMLDocument.Create(Application);
  try
    oxml.XML.Text:=SOAPRequest;
    oXML.Active:=true;
    oXML.XML.Text:=StringReplace(oXML.XML.Text,'<Blub><BlubId>','<Blub xsi:type="BlubTyp"><BlubId>',[rfReplaceAll]);
    SOAPRequest:=oXML.XML.Text;
    oXML.XML.SaveToFile('e:\test_1.xml');
dann wird in dem XML das Ersetzen korrekt durchgeführt. Wenn ich das ganze jetzt über Attribute versuche:

Delphi-Quellcode:
  oXML:=TXMLDocument.Create(Application);
  try
    oxml.XML.Text:=SOAPRequest;
    oXML.Active:=true;
    oNodeBlub:=(oXML.DOMDocument as IDOMNodeSelect).selectNodes('//BlubId');  
    for iINdex:=0 to oNodeBlub.length-1 do begin
      oNode:=oNodeBlub.item[iINdex];
      oNode:=oNode.parentNode;
      oAttr:=oXML.DOMDocument.createAttribute('xsi:type');
      oAttr.nodeValue:='BlubTyp';
      oNode.attributes.setNamedItem(oAttr);
    end;
    SOAPRequest:=oXML.XML.Text;
    oXML.XML.SaveToFile('e:\test_1.xml');
Dann klappt das nicht. In der Text_1.xml ist kein Attribut enthalten. Allerdings ist nach dem Node.Attributes.SetNamedItem() der Wert Node.Attributes.Length=1 (vorher 0) - also wurde ein Attribut hinzugefügt.

Wenn ich jetzt dieses XML (ohne Attribut) in einer anderen Prozedur lade und den selben Code oben darauf los lasse, dann wird das Attribut gesetzt und gespeichert.

Ich dreh langsam durch. Ich versteh nich was ich falsch mache. Würde mich echt freuen, wenn mir jemand helfen kann..
Grüße

sx2008 15. Apr 2012 02:24

AW: Soap Request bearbeiten
 
Dein Weg um Attribute zu erzeugen kommt mir reichlich kompliziert vor.
Warum nicht so?
Delphi-Quellcode:
   
for iINdex:=0 to oNodeBlub.length-1 do begin
   oNode:=oNodeBlub.item[iINdex];
   oNode:=oNode.parentNode;
   oNode.setAttribute('xsi:type','BlubTyp');
end;
Attribute gibt es ja im Gegensatz zu Elementen nur einmal.
Deshalb kann man sie einfach setzen (und damit einen neuen Knoten im DOM erzeugen).

Deinen XPath - Ausdruck '//BlubId' kann man bestimmt noch verbessern.
Im Moment sagt er ja "gibt mir alle <BlubId> - Elemente zurück".
Was du wirklich brauchst wäre:
"Gib mir alle <Blub> - Elemente zurück, die ein <BlubId> - Element enthalten".
Damit lässt sich die Schleife nochmals vereinfachen.
Vielleicht so '//BlubId/..' oder '//BlubId/parent::Blub' ?

Lemmy 17. Apr 2012 09:39

AW: Soap Request bearbeiten
 
HI,

klappt jetzt, habe das Ermitteln der Nodes geändert um IXMLNodes zurück zu bekommen und mit SetAttributeNS klappte das dann auch mit dem Speichern.
@sx2008: ein SetAttribute gibts bei IDOMNodes aber nicht und wenn ich mit XPAth die Nodes suchen will bekomm ich nur die zurück. Deine Vorschläge zu XPath sind interessant, funktionieren jedoch nicht bei mir (Fehlermeldungen) - könnte es daran liegen dass ich noch Delphi 7 nutze? Egal, hat geklappt..

bzw. nur teilweise....

Die XML wird jetzt wie gedacht geändert und auch auf der HDD gespeichert und auch dem Parameter SoapRequest übergeben. Allerdings wird dennoch an den Service die unveränderte Nachricht geschickt (habe ich mit http://www.membrane-soa.org/downloads/http-monitor.htm geprüft). Ich habe das Projekt dann man unter XE2 getestet, funktioniert wie gewünscht, das fehlende Attribut steht drin und wird übertragen. Gibts irgend welche Erkenntnisse, dass die Bearbeitung des Soap-Request unter Delphi 7 nicht funktioniert?

Lemmy 17. Apr 2012 11:11

AW: Soap Request bearbeiten
 
Nachtrag: ist ein Bug in Delphi 7 der später behoben wurde :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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