amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > XML Soap Doppelte Maskierung? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

13.09.2010, 15:32 Uhr

Mad_Dog
Posts: 1944
Nutzer
Hallo,

Ich arbeite gerade an php einem Programm, welches per SOAP ein XML Dokument bekommt. Dabei ist das empfangene XML-Dokument aber so gestrickt, daß einer der Knoten des Body-Knotens einen String enthält, der selbst wierderum ein XML-Dokument darstellt, wobei aber alle Sonderzeichen ausmaskiert sind:
xml code:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SendDataResponse xmlns="http://tourist.bz.it/data">
<SendDataResult><?xml version="1.0" encoding="UTF-8"?><RespData Ticks="46,8783"><HotelDefinition><Data A0RID="FC4F82E72867423FAA499A9E9D83653F" A0BOn="1" G11RID="B32292E9D51E4EDBA7B9B97474FFA10C" A0TVatNo="01241570215" A0TTaxNo="01241570215" A0TID="33" S7RID="79CBD6E151C911D18F1400A02427D15E" A0Ene="1" />

usw.


Wenn ich mir jetzt auß dem äußeren SOAP Dokument ein DOMDocument-Objekt mache, den Knoten "SendDataResult" mittels der Methode DOMDocument::getElementsByTagName() hole und davon dann das Attribut textContent hole, bekomme ich das "innere", ausmaskierte XML-Dokument als String.
php code:
$result_nodes = $doc->getElementsByTagName("SendDataResult");
			
			if ($result_nodes->length > 0)
			{
				$result_node = $result_nodes->item(0);


Damit bekomme ich sowas:
xml code:
<?xml version="1.0" encoding="UTF-8"?><RespData Ticks="46,8783"><HotelDefinition><Data A0RID="FC4F82E72867423FAA499A9E9D83653F" A0BOn="1" G11RID="B32292E9D51E4EDBA7B9B97474FFA10C" A0TVatNo="01241570215" A0TTaxNo="01241570215" A0TID="33" S7RID="79CBD6E151C911D18F1400A02427D15E" A0Ene="1" />

usw.


Um daraus wiederum ein DOMDocument-Objekt machen zu können, muß ich diesen String ja irgendwie wieder in die unmaskierte Form umwandeln, damit ich ihn der Methode DOMDocument::loadXML() eines weiteren DOMDocument-Objekts übergeben kann... Dazu benutze ich html_entity_decode:
xml code:
$xml_result = html_entity_decode($result_node->textContent);


Als Ergebnis erhalte ich dann sowas:
xml code:
<?xml version="1.0" encoding="UTF-8"?>
<RespData Ticks="46,8783">
<HotelDefinition>
<Data A0RID="FC4F82E72867423FAA499A9E9D83653F" A0BOn="1" G11RID="B32292E9D51E4EDBA7B9B97474FFA10C" A0TVatNo="01241570215" A0TTaxNo="01241570215" A0TID="33" S7RID="79CBD6E151C911D18F1400A02427D15E" A0Ene="1" />
</HotelDefinition>


So ein String läßt sich zwar wunderbar an die Methode DOMDocument::loadXML() übergeben funktioniert das wunderbar. Aber nur solange, wie die Attribute selbst keine Sonderzeichen wie ",',&,< oder > enthalten. Denn dann ergibt sich beim Entfernen der Maskierung etwa sowas:
xml code:
<dummy foo="bla "bla" > bla < bla" />


Sowas ist dann natürlich nicht mehr wohlgeformt.

Irgendwie komm ich nicht drauf, was ich dagegen machen kann.
Meine erste Idee war, alles zwischen " nicht " und " nochmal zu maskieren. Aber das versagt in dem Fall, daß da Anführungszeichen mit im Text des Attributs stehen.

Im Moment komme ich nicht auf die Lösung...

Bevor jetzt einer sagt, ich soll lieber in einem php-Forum nachfragen: Hier habe ich immer kompetentere Antworten als wo anders bekommen... ;)


--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

13.09.2010, 15:57 Uhr

Thore
Posts: 2266
Nutzer
Hi

Ich bin ebenfalls gerade an SOAP ;)
Kannst Du die " in den Parameter nicht mit maskieren?

Um diese " in den Parametern zu suchen, steht man vor einem semientscheidbaren Problem soweit ich weiß.

Ein Parameter:
<Tag param="test " xx " " param2="xx">
Kann durch Suche des = und > Zeichens zu den Tags:
test " xx "
xx
zurückgeführt werden. Schlägt jedoch fehl, wenn es nur ein Parameter ist, der so aussehen soll:
test " xx " " param2="xx

Ist also nicht eindeutig.

Deshalb muss vor dem Erstellen des Parameters der Inhalt maskiert werden. Dabei wird " zu " und zu \

Die Eindeutigkeit ergibt sich dann:
<Tag param="test " xx " " param2="xx">
im ersten Fall, und
<Tag param="test " xx " " param2="xx">
im zweiten Fall.

Wie du das direkt anwendest, woher du die Daten bekommst, das wissen wir hier ja nicht. Allerdings, wenn das XML schon so "verhunzt" aussieht wenns ankommt, wirds schwierig.

Wenn ich Dich missverstanden hab, bitte ich um Korrektur ;)

[ - Antworten - Zitieren - Direktlink - ]

13.09.2010, 16:09 Uhr

Holger
Posts: 8116
Nutzer
@Mad_Dog:
Ich verstehe nicht so ganz, wozu Du die Funktion html_entity_decode benutzt. In Deinem Beispiel, in dem keine html-Entities vorkommen, sprich, der Text vollkommen unverändert bleibt, außer, dass Du Zeilenumbrüche eingefügt hast, die wohl kaum von dieser Funktion kommen, aber für XML eh keine Rolle spielen, funktioniert alles.

Was Du jetzt beschreibst, ist, dass sobald Entities in dem Text vorkommen, die Funktion html_entity_decode genau das macht, wozu sie da ist, nämlich die Entities zu dekodieren, was Du offensichtlich gar nicht willst.

Also, wozu rufst Du sie überhaupt auf?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

13.09.2010, 19:56 Uhr

Mad_Dog
Posts: 1944
Nutzer
Hallo,

Ich bin in der Zwischenzeit selbst darauf gekommen, wo der Fehler lag.

Ich glaube, das wird hier im Forum nicht richtig dargestellt, aber der ursprüngliche String, welcher das "Unterdokument" darstellt, ist doppelt Maskiert, d.h. es sind die Strings der Attribute maskiert und das ganze XML-Dokument dann nochmal.

code:
<dummy foo="bar &quot;String in Anführungszeichen&quot; "/>


usw.

Wenn das ganze aber als String innerhalb eines Knotens des äußeren SOAP-Dokuments steht und ich den dann per DOMDocument::getElementsByTagName() hole, dann steht auf wundersame Weise im Attribut textContent dieses Knotens der String in der richtigen Codierung. Woher hätte ich das wissen sollen? Ich habe eigentlich erwartet, daß textContent dann den ursprünglichen String enthält. Deshalb die Sache mit html_entity_decode.

Aber jetzt funzt es ja. :)

P.S. Mist, hier werden die maskierten Anführungszeichen leider automatisch ersetzt. Aber Thore hat's schon verstanden worum es ging.

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 13.09.2010 um 20:02 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > XML Soap Doppelte Maskierung? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.