2013-06-11 6 views
-1

У меня есть запрос xml, который выглядит как код ниже, и я хотел бы хранить в переменной PHP ТОЛЬКО значение в узле RATE, которое должно появиться в Response.Доступ к определенному узлу XML с PHP

Как я мог это достичь?

$zip = 90002; 
$pounds = 0.1; 
$shippingMode = "Express"; 
$url = "http://production.shippingapis.com/shippingAPI.dll"; 

$devurl ="testing.shippingapis.com/ShippingAPITest.dll"; 
$service = "RateV4"; 
$xml = rawurlencode("<RateV4Request USERID='USER' > 
<Revision/> 
    <Package ID='1ST'> 
      <Service>$shippingMode</Service> 
      <ZipOrigination>10025</ZipOrigination> 
      <ZipDestination>".$zip."</ZipDestination> 
      <Pounds>".$pounds."</Pounds> 
      <Ounces>0</Ounces> 
      <Container></Container> 
      <Size>REGULAR</Size> 
      <Width></Width> 
      <Length></Length> 
      <Height></Height> 
      <Girth></Girth> 
    </Package> 
</RateV4Request>"); 
$request = $url . "?API=" . $service . "&xml=" . $xml; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$request); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($ch); 
curl_close($ch); 

Ответ должен быть примерно таким. Мне просто нужно получить значение RATE.

<?xml version="1.0" encoding="UTF-8"?> 
<RateV4Response> 
    <Package ID="1ST"> 
      <ZipOrigination>44106</ZipOrigination> 
      <ZipDestination>20770</ZipDestination> 
      <Pounds>1</Pounds> 
      <Ounces>8</Ounces> 
      <Container>NONRECTANGULAR</Container> 
      <Size>LARGE</Size> 
      <Width>15</Width> 
      <Length>30</Length> 
      <Height>15</Height> 
      <Girth>55</Girth> 
      <Zone>3</Zone> 
      <Postage CLASSID="1"> 
       <MailService>Priority Mail&lt;sup&gt;&amp;reg;&lt;/sup&gt;</MailService> 
       <Rate>24.85</Rate> 
      </Postage> 
    </Package> 
</RateV4Response> 

Последняя КОД

$zip = 90002; 
$pounds = 0.1; 
$shippingMode = "Express"; 
function USPSParcelRate($pounds,$zip,$shippingMode) { 
$url = "http://production.shippingapis.com/shippingAPI.dll"; 

$devurl ="testing.shippingapis.com/ShippingAPITest.dll"; 
$service = "RateV4"; 
$userid = "023TAHAR4995"; 
$xml = rawurlencode("<RateV4Request USERID='023TAHAR4995' > 
<Revision/> 
    <Package ID='1ST'> 
      <Service>$shippingMode</Service> 
      <ZipOrigination>10025</ZipOrigination> 
      <ZipDestination>".$zip."</ZipDestination> 
      <Pounds>".$pounds."</Pounds> 
      <Ounces>0</Ounces> 
      <Container></Container> 
      <Size>REGULAR</Size> 
      <Width></Width> 
      <Length></Length> 
      <Height></Height> 
      <Girth></Girth> 
    </Package> 
</RateV4Request>"); 
$request = $url . "?API=" . $service . "&xml=" . $xml; 
// send the POST values to USPS 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$request); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_HTTPGET, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
// parameters to post 


$result = curl_exec($ch); 
curl_close($ch); 
$response = new SimpleXMLElement($result); 

echo $response->RateV4Response->Package->Postage->Rate; 

} 
USPSParcelRate($pounds,$zip, $shippingMode); 
+0

использование SimpleXML ... http: //www.w3schools.com/php/php_xml_simplexml.asp – KyleK

+0

Но как я могу получить ответ от вышеуказанного ЗАПРОСА, чтобы я мог применить «новый SimpleXMLElement ($ response)»? – samyb8

+0

ну, у вас есть результат в коде уже ... $ result = curl_exec ($ ch); ?? просто передайте, что $ result в simpleXML ... см. ниже ... – KyleK

ответ

1

Heres хороший учебник по этому вопросу ...

http://blog.teamtreehouse.com/how-to-parse-xml-with-php5

Это бы что-то вроде этого ... вероятно, не работает сразу, так как я на самом деле не переварил структуру вашего xml ... просто взглянул на нее .... но что-то ING вдоль этих линий ... :)

$request = $url . "?API=" . $service . "&xml=" . $xml; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$request); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_HTTPGET, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $result = curl_exec($ch); 

    $XML = new SimpleXMLElement($result); 

    foreach($XML->Package as $val){ 
    echo $val->Postage->Rate; 
     } 

Или, если его всегда только один ответ/узел пакет ...., то вы можете просто получить скорость, как это ...

echo $XML->Pacakge->Postage->Rate; 
+0

Это ничего не печатает ... Я обновил сообщение с новым кодом – samyb8

+0

Что произойдет, если вы var_dump ($ response)? и не закрывать_curl до этого – KyleK

+0

Вы уверены, что ваш ответ таков, что XML-файл? что происходит, когда вы var_dump ($ result) после $ result = curl_exec ($ ch); – KyleK