Search code examples
phpxmlpaymentdomdocumentnodevalue

Get content from XML PHP5


I´m working on a paymentsolution and need some help with the PHP. I´m doing a HTTPRequest and in response I will get some XML. The XML Could look like this:

<?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>

Basically what I want to do is to get the content from the tags and save them in strings.

I tried this:

$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;

But obviously there is something wrong since it won´t echo anything.. Suggestions?


Solution

  • If you are only trying to read some data from an XML string, the simplest way would probably be to use SimpleXML, and not DOM -- DOM is well suited when it comes to writing XML, but for reading, SimpleXML is much easy to work with.

    For instance, you could use something like this as a starting point :
    Note I used the simplexml_load_string function to load the XML string.

    $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 />';
    

    Which would give you the following output :

    12
    authurl
    

    Basically, with SimpleXML, the XML tree is available as an object -- the root node of the XML not being present in the tree, as it's the root ; which is why I didn't have to include payer to access the data.