2010-03-02 15 views
1

Je travaille sur une solution de paiement et j'ai besoin d'aide avec le PHP. Je fais un HTTPRequest et en réponse j'obtiendrai du XML. Le XML pourrait ressembler à ceci:Obtenir du contenu de XML PHP5

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

Au fond ce que je veux faire est d'obtenir le contenu des étiquettes et de les enregistrer dans les chaînes.

J'ai essayé ceci:

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

Mais, évidemment, il y a quelque chose de mal, car il ne le ferai pas quelque chose d'écho .. Suggestions?

Répondre

4

Si vous essayez seulement de lire des données à partir d'une chaîne XML, la façon la plus simple serait probablement d'utiliser SimpleXML, et non DOM - DOM est bien adapté quand il s'agit d'écrire du XML, mais pour la lecture, SimpleXML est très facile à utiliser.

Par exemple, vous pouvez utiliser quelque chose comme ceci comme point de départ:
Remarque J'ai utilisé la fonction simplexml_load_string pour charger la chaîne 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 />'; 

qui vous donne le résultat suivant:

12 
authurl 

Fondamentalement, avec SimpleXML, l'arbre XML est disponible sous forme d'un objet - le nœud racine du XML ne pas être présent dans l'arbre, comme c'est la racine; c'est pourquoi je n'ai pas eu besoin d'inclure payer pour accéder aux données.

0

Vous pouvez regarder SimpleXML - c'est beaucoup, beaucoup plus simple à utiliser que DOMDocument. Il vous donnera les données XML de retour sous une forme d'objet analysé, de sorte que vous pouvez faire des choses comme ceci:

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

Essayez d'utiliser simplexml_load_string ($ string); puis faites juste un foreach comme ça

$xml = simplexml_load_string($string); 

foreach($xml as $item) 
{ 
echo $item->description; // would print the description 
// continiu your logic here 
} 
0

Ne pas utiliser DOM pour ce genre de choses, utilisez SimpleXML à la place.

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

être ici une solution avec DOM

suggestion d'abord: définir error_reporting(-1) voir toutes les erreurs potentielles. Si vous faites cela, vous verrez PHP soulèvent plusieurs avis au sujet

Notice: Trying to get property of non-object 

pour les appels ->item(0) aux éléments DomNodeList. La solution assez simple consiste à utiliser

$orderXML->loadXml($order); 

au lieu de load(), parce que load charge un document XML à partir d'un fichier.