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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top