2010-03-02 95 views
1

我正在开发一个付款解决方案,并且需要PHP的一些帮助。我正在做一个HTTPRequest,作为回应,我会得到一些XML。该XML看起来是这样的:从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> 

基本上就是我想要做的是让来自标签的内容,并将它们保存在字符串中。

我尝试这样做:

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

但显然也有一些是错误的,因为它不需额外回声什么..建议?

回答

4

如果你只是想从XML字符串读一些数据,最简单的方法可能会使用SimpleXML,而不是DOM - DOM非常适合编写XML,但对于阅读而言,SimpleXML非常易于使用。

例如,你可以使用类似的东西作为起点:
注意我使用simplexml_load_string函数来加载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 />'; 

这将使您的输出如下:

12 
authurl 

基本上,用SimpleXML,XML树可作为一个对象 - 不存在于树中的XML的根节点,因为它是根源;这就是为什么我不必包括payer来访问数据。

0

您可能会看SimpleXML - 使用DOMDocument更简单多了。它会给你的XML数据早在解析对象的形式,这样就可以做这样的事情:

$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

尝试使用simplexml_load_string($ string); 然后只是做一个foreach与它这样的

$xml = simplexml_load_string($string); 

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

不要使用DOM的那种东西,使用SimpleXML代替。

$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

这里与DOM

的第一个建议的解决方案:设置error_reporting(-1)看到任何潜在的错误。如果你这样做,你会看到PHP提高对

Notice: Trying to get property of non-object 

->item(0)来电来的DOMNodeList元素注意的几个问题。相当简单的解决方案是使用

$orderXML->loadXml($order); 

,而不是load(),因为load加载XML文档从一个文件中。