Auslesen von XML
Mika
- php
Hi,
ich sende mit Rechner A einen XML Stream an Rechner B.
Wo steht der Stream drin? Also wie kann ich ihn mit PHP auf Rechner B ansprechen? Auf Rechner B möchte ich dann mit einem XML antworten. Wie stelle ich das am geschicktesten an? Wenn ich es einfach mit echo ausgebe, gibt er es zwar zurück, allerdings hängt er die Sendebestätigung an, wie krieg ich die weg - bzw. wie spreche ich in diesem Fall das XML an?
Hier die Antwort
HTTP/1.1 200 OK
Date: Fri, 23 Jun 2006 00:10:42 GMT
Server: Apache
X-Powered-By: PHP/5.1.4-pl1-gentoo
Content-Length: 277
Connection: close
Content-Type: text/html; charset=ISO-8859-1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
<sender username="USERNAME" password="PASSWORT"/>
<content
<msg>MSG</msg>
</content>
</xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>
echo $begrüßung;
ich sende mit Rechner A einen XML Stream an Rechner B.
Wie genau machst du das?
Wo steht der Stream drin? Also wie kann ich ihn mit PHP auf Rechner B ansprechen? Auf Rechner B möchte ich dann mit einem XML antworten. Wie stelle ich das am geschicktesten an?
Die Beantwortung dieser Fragen ist abhängig von obiger Frage.
Wenn ich es einfach mit echo ausgebe, gibt er es zwar zurück, allerdings hängt er die Sendebestätigung an, wie krieg ich die weg - bzw. wie spreche ich in diesem Fall das XML an?
Wenn du ein bestimmtes Übertragungsprotokoll verwendest musst du den Protokolloverhead entfernen, wenn du an die Nutzdaten gelangen willst.
Hier die Antwort
HTTP/1.1 200 OK
Für HTTP als Protokoll gibt es Lösungen, die sich darum kümmern. Beispielsweise seien die Pakete von PEAR_HTTP erwähnt.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
...
</xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>
Das sieht mir nicht nach gültigem XML aus.
echo "$verabschiedung $name";
Hi,
echo $begrüßung;
ich sende mit Rechner A einen XML Stream an Rechner B.
Wie genau machst du das?
Damit:
function PostToGateway ($host, $port, $path, $referer, $data_to_send) {
$fp = fsockopen ($host, $port);
fputs($fp, "POST $path HTTP/1.1\n");
fputs($fp, "Host: $host\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: ".strlen($data_to_send)."\n");
fputs($fp, "Connection: close\n\n");
fputs($fp, "$data_to_send\n");
while(!feof($fp)) {
$answer .= fgets($fp, 128);
}
fclose($fp);
return $answer;
}
Wo steht der Stream drin? Also wie kann ich ihn mit PHP auf Rechner B ansprechen? Auf Rechner B möchte ich dann mit einem XML antworten. Wie stelle ich das am geschicktesten an?
Die Beantwortung dieser Fragen ist abhängig von obiger Frage.
Wenn ich es einfach mit echo ausgebe, gibt er es zwar zurück, allerdings hängt er die Sendebestätigung an, wie krieg ich die weg - bzw. wie spreche ich in diesem Fall das XML an?
Wenn du ein bestimmtes Übertragungsprotokoll verwendest musst du den Protokolloverhead entfernen, wenn du an die Nutzdaten gelangen willst.
Hier die Antwort
HTTP/1.1 200 OKFür HTTP als Protokoll gibt es Lösungen, die sich darum kümmern. Beispielsweise seien die Pakete von PEAR_HTTP erwähnt.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
...
</xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>Das sieht mir nicht nach gültigem XML aus.
Ich habe da in der Mitte die Zeilen rausgeschmissen, sonst wäre es etwas lang geworden...
echo "$verabschiedung $name";
Hallo Mika,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
...
</xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>
Das sieht mir nicht nach gültigem XML aus.
Ich habe da in der Mitte die Zeilen rausgeschmissen, sonst wäre es etwas lang geworden...
ja, das ist ja durch die Auslassungspunkte klar. Aber ein gültiges XML-Dokument hat *genau ein* Root-Element, das ist bei dir xml-send, wie es ja auch im DOCTYPE vereinbart ist. Aber die danach folgenden Elemente (A, B, C, ...) sind auf gleicher Ebene nicht zulässig, höchstens als Kindelemente von xml-send.
So long,
Martin
PS: Und bitte zitiere nicht das *komplette* Vorgängerposting, sondern nur die Abschnitte, auf die du antwortest. Danke.
Hallo Mika,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
...
</xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>
Das sieht mir nicht nach gültigem XML aus.Ich habe da in der Mitte die Zeilen rausgeschmissen, sonst wäre es etwas lang geworden...
ja, das ist ja durch die Auslassungspunkte klar. Aber ein gültiges XML-Dokument hat *genau ein* Root-Element, das ist bei dir xml-send, wie es ja auch im DOCTYPE vereinbart ist. Aber die danach folgenden Elemente (A, B, C, ...) sind auf gleicher Ebene nicht zulässig, höchstens als Kindelemente von xml-send.
OK, in Ordnung. Angenommen ich hätte jetzt ein richitges XML. Hättest du nen Lösungsansatz für das Problem?
So long,
MartinPS: Und bitte zitiere nicht das *komplette* Vorgängerposting, sondern nur die Abschnitte, auf die du antwortest. Danke.
Hello out there!
Würdest du dir bitte vor dem Antworten das Posting, auf das du antwortest, erstmal durchlesen? Bis zum Ende.
See ya up the road,
Gunnar
PS: Das Ende ist NACH dem PS.
Hello out there!
Aber ein gültiges XML-Dokument hat *genau ein* Root-Element, das ist bei dir xml-send, wie es ja auch im DOCTYPE vereinbart ist.
Darf es das?
„Namen, die mit »xml« oder mit einer Zeichenkette beginnen, die zu (('X'|'x') ('M'|'m') ('L'|'l')) passt, sind für die Standardisierung in dieser oder einer zukünftigen Version dieser Spezifikation reserviert.“ [XML]
See ya up the road,
Gunnar
echo $begrüßung;
$fp = fsockopen ($host, $port);
fputs($fp, "POST $path HTTP/1.1\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "$data_to_send\n");
O.K., du tust also so, als ob du ein Formular per POST absendest.
Wo steht der Stream drin? Also wie kann ich ihn mit PHP auf Rechner B ansprechen?
Ich gehe mal davon aus, dass auf der Empfängerseite ebenfalls ein PHP-Script lauert. Ist in $data_to_send etwas, das wie Formulardaten aussieht? Dann greife es über $_POST auf der Empfängerseite ab. Wenn nicht, findest du den Inhalt von $data_to_send in $HTTP_RAW_POST_DATA wieder, wenn always_populate_raw_post_data eingeschaltet ist.
Auf Rechner B möchte ich dann mit einem XML antworten. Wie stelle ich das am geschicktesten an?
Beantworte doch einfach den HTTP-Request mit den den zurückzusendenden Daten.
echo "$verabschiedung $name";
Wo steht der Stream drin? Also wie kann ich ihn mit PHP auf Rechner B ansprechen?
Ich gehe mal davon aus, dass auf der Empfängerseite ebenfalls ein PHP-Script lauert. Ist in $data_to_send etwas, das wie Formulardaten aussieht? Dann greife es über $_POST auf der Empfängerseite ab. Wenn nicht, findest du den Inhalt von $data_to_send in $HTTP_RAW_POST_DATA wieder, wenn always_populate_raw_post_data eingeschaltet ist.
Ja, die Empfängerseite ist auch ein PHP Script. Wenn du eine bessere Idee hat, wie ich das übertrage, bin ich da gerne bereit was umzustricken. Sinn des ganzen soll halt folgender sein:
Rechner A bis Rechner D haben alle den "Clienten". Rechner Z hat dann den Server. A bis D können alle an Z das xml senden. Z verarbeitet das XML dann und schreibt es in ne Datenbank. Den Erfolg oder Misserfolg gibt er mit einem XML zurück. Wenn ich bis jetzt das XML aber sende, dann liegt es nicht in einer Variablen vor, sondern "zertrennt" im $_POST. Also $_POST[<?xml version] mit Inhalt
="1.0" encoding="UTF-8"?>
<!DOCTYPE xml-send SYSTEM "">
<xml-send>
<A>DNR1</A>
<B>DNR2</B>
<C>DNR3</C>
</xml-send>
Ich könnte das jetzt irgendwie zusammenbasteln. Klingt mir aber nicht sehr sauber.
Auf Rechner B möchte ich dann mit einem XML antworten. Wie stelle ich das am geschicktesten an?
Beantworte doch einfach den HTTP-Request mit den den zurückzusendenden Daten.
echo "$verabschiedung $name";