Acquisizione di contenuti da PHP5 XML
-
23-09-2019 - |
Domanda
sto lavorando su un paymentsolution e hanno bisogno di aiuto con il PHP. Sto facendo un HTTPRequest e in risposta mi metterò un po 'di XML. L'XML potrebbe apparire così:
<?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>
Fondamentalmente quello che voglio fare è quello di ottenere il contenuto dai tag e salvarli in stringhe.
Ho provato questo:
$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;
Ma ovviamente c'è qualcosa di sbagliato in quanto vinto't eco nulla .. Suggerimenti?
Soluzione
Se si sta tentando solo di rel lettura alcuni dati da una stringa XML, il modo più semplice sarebbe probabilmente quella di utilizzare SimpleXML , e non DOM - DOM è adatto quando si tratta di scrivere XML, ma per la lettura, SimpleXML è molto più facile da lavorare.
Per esempio, si potrebbe usare qualcosa di simile a questo come un punto di partenza:
Nota Ho usato la funzione simplexml_load_string
per caricare la stringa XML.
$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 />';
che darebbe il seguente output:
12
authurl
In sostanza, con SimpleXML, l'albero XML è disponibile come oggetto - il nodo radice del XML non essendo presente nella struttura, come è la radice; è per questo che non ho dovuto includere payer
per accedere ai dati.
Altri suggerimenti
Si potrebbe guardare SimpleXML - è molto, molto più semplice da utilizzare poi DOMDocument. Vi darà la schiena di dati XML in una forma oggetto analizzata, in modo che si può fare cose come questa:
$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);
Provare a utilizzare simplexml_load_string ($ string); poi basta fare un foreach con esso come questo
$xml = simplexml_load_string($string);
foreach($xml as $item)
{
echo $item->description; // would print the description
// continiu your logic here
}
Non utilizzare DOM per questo genere di cose, uso SimpleXML , invece.
$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;
Qui essere una soluzione con DOM
In primo suggerimento: insieme error_reporting(-1)
per vedere gli errori possibili. Se si esegue questa operazione si vedrà PHP sollevano varie Annunci circa
Notice: Trying to get property of non-object
per le chiamate ->item(0)
agli elementi DOMNodeList. La soluzione piuttosto semplice è quella di utilizzare
$orderXML->loadXml($order);
al posto di load()
, perché carichi load
un documento XML da un file.