Holen Sie sich Inhalte von XML PHP5
-
23-09-2019 - |
Frage
Ich arbeite an einer Zahlung und brauche Hilfe beim PHP. Ich mache ein httprequest und als Antwort werde ich etwas XML bekommen. Der XML könnte so aussehen:
<?xml version="1.0" encoding="utf-8" ?>
<payer>
<purchase_list>
<freeform_purchase>
<line_number>1</line_number>
<description>description</description>
<price_including_vat>12</price_including_vat>
<vat_percentage>
15
</vat_percentage>
<quantity>10</quantity>
</freeform_purchase>
</purchase_list>
<payment_urls>
<auth_url>authurl</auth_url>
<settle_url>settleurl</settle_url>
</payment_urls>
</payer>
Grundsätzlich möchte ich die Inhalte von den Tags abrufen und sie in Saiten speichern.
Ich habe das versucht:
$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
<purchase_list>
<freeform_purchase>
<line_number>1</line_number>
<description>description</description>
<price_including_vat>12</price_including_vat>
<vat_percentage>
15
</vat_percentage>
<quantity>10</quantity>
</freeform_purchase>
</purchase_list>
<payment_urls>
<auth_url>authurl</auth_url>
<settle_url>settleurl</settle_url>
</payment_urls>
</payer>';
$orderXML = new DOMDocument();
$orderXML->load($order);
$payerXML = $orderXML->getElementsByTagName( 'payer' );
$purchase_listXML = $orderXML->getElementsByTagName( 'purchase_list' );
$freeform_purchaseXML = $orderXML->getElementsByTagName( 'freeform_purchase' );
$linenumberXML = $orderXML->getElementsByTagName( 'line_number' );
$descriptionXML = $orderXML->getElementsByTagName( 'description' );
$price_inc_vatXML = $orderXML->getElementsByTagName( 'price_including_vat' );
$vat_percentageXML = $orderXML->getElementsByTagName( 'vat_percentage' );
$quantityXML = $orderXML->getElementsByTagName( 'quantity' );
$settle_urlXML = $orderXML->getElementsByTagName( 'settle_url' );
$auth_urlXML = $orderXML->getElementsByTagName( 'auth_url' );
$theLineNumber = $linenumberXML->item(0)->nodeValue;
$theValue = $descriptionXML->item(0)->nodeValue;
$freeform_price = $price_inc_vatXML->item(0)->nodeValue;
$freeform_vat = $vat_percentageXML->item(0)->nodeValue;
$freeform_quantity = $quantityXML->item(0)->nodeValue;
$Settle_url = $settle_urlXML->item(0)->nodeValue;
$Auth_url = $auth_urlXML->item(0)->nodeValue;
echo 'thLineNumber - ' . $theLineNumber;
echo $theValue;
echo $freeform_price;
echo $freeform_vat;
echo $freeform_quantity;
echo $Settle_url;
echo $Auth_url;
Aber offensichtlich stimmt etwas nicht, da es nichts wiederholt. Vorschläge?
Lösung
Wenn Sie nur versuchen lesen Einige Daten aus einer XML Simplexml, und nicht Dom - DOM ist gut geeignet, wenn es um das Schreiben von XML geht, aber zum Lesen ist Simplexml viel einfach zu bearbeiten.
Zum Beispiel könnten Sie so etwas als Ausgangspunkt verwenden:
Beachten Sie, dass ich die verwendet habe simplexml_load_string
Funktion zum Laden der XML -Zeichenfolge.
$string = <<<STR
<?xml version="1.0" encoding="utf-8" ?>
<payer>
<purchase_list>
<freeform_purchase>
<line_number>1</line_number>
<description>description</description>
<price_including_vat>12</price_including_vat>
<vat_percentage>
15
</vat_percentage>
<quantity>10</quantity>
</freeform_purchase>
</purchase_list>
<payment_urls>
<auth_url>authurl</auth_url>
<settle_url>settleurl</settle_url>
</payment_urls>
</payer>
STR;
$xml = simplexml_load_string($string);
echo intval($xml->purchase_list->freeform_purchase->price_including_vat) . '<br />';
echo (string)$xml->payment_urls->auth_url . '<br />';
Das würde Ihnen die folgende Ausgabe geben:
12
authurl
Grundsätzlich ist der XML -Baum mit simplexml als Objekt verfügbar - der Wurzelknoten des XML ist nicht im Baum vorhanden, da es die Wurzel ist. Deshalb musste ich nicht einbeziehen payer
Zugriff auf die Daten.
Andere Tipps
Sie könnten sich ansehen Simplexml - Es ist viel, viel einfacher zu verwenden als Domdocument. Es gibt Ihnen die XML -Daten in einem analysierten Objektform zurück, damit Sie solche Dinge tun können:
$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
<purchase_list>
<freeform_purchase>
<line_number>1</line_number>
<description>description</description>
<price_including_vat>12</price_including_vat>
<vat_percentage>
15
</vat_percentage>
<quantity>10</quantity>
</freeform_purchase>
</purchase_list>
<payment_urls>
<auth_url>authurl</auth_url>
<settle_url>settleurl</settle_url>
</payment_urls>
</payer>';
// Alternative version: $xml = new SimpleXMLElement($order);
// (completely equivalent to the below line)
$xml = simplexml_load_string($order);
$vat_pct = intval($xml->purchase_list->freeform_purchase->vat_percentage);
Versuchen Sie es mit Simplexml_Load_String ($ String); Dann machen Sie einfach so einen Vorgang damit
$xml = simplexml_load_string($string);
foreach($xml as $item)
{
echo $item->description; // would print the description
// continiu your logic here
}
Verwenden Sie DOM nicht für solche Dinge, verwenden Sie Simplexml stattdessen.
$payer = simplexml_load_string($order);
$freeform_purchase = $payer->purchase_list->freeform_purchase;
echo "Line number: ", $freeform_purchase->line_number, "\n";
echo "Description: ", $freeform_purchase->description, "\n";
echo "Auth URL: ", $payer->payment_urls->auth_url, "\n";
echo "Settle URL: ", $payer->payment_urls->settle_url, "\n";
// if you use the values as strings, cast them as strings
$description = (string) $freeform_purchase->description;
// if you have to use the values for math, cast them as integers
$vat_percentage = (int) $freeform_purchase->vat_percentage;
Hier sei eine Lösung mit DOM
Erster Vorschlag: Festlegen error_reporting(-1)
potenzielle Fehler zu sehen. Wenn Sie dies tun
Notice: Trying to get property of non-object
für die ->item(0)
Anrufe an die Domnodelist -Elemente. Die ziemlich einfache Lösung ist zu verwenden
$orderXML->loadXml($order);
Anstatt von load()
, Weil load
Laden Sie ein XML -Dokument aus einer Datei.