как анализировать xml с помощью php

#php #drupal #drupal-6

#php #drupal #drupal-6

Вопрос:

Я пытаюсь прочитать ленту погоды с Yahoo на свой сайт. Используя приведенный ниже код, я смог распечатать xml. Чего я действительно хочу достичь сейчас, так это поместить температуру и изображение в две разные переменные

  $zipCode = "44418";
 $url = "http://weather.yahooapis.com/forecastrss";
 $zip = "?w=$zipCode";
 $fullUrl = $url . $zip.'amp;u=c';
 $curlObject = curl_init();
 curl_setopt($curlObject,CURLOPT_URL,$fullUrl);
 curl_setopt($curlObject,CURLOPT_HEADER,false);
 curl_setopt($curlObject,CURLOPT_RETURNTRANSFER,true);
 $returnYahooWeather = curl_exec($curlObject);
 curl_close($curlObject);
 print "yahooWeather". $returnYahooWeather;

//$temperature 
//$image
  

Комментарии:

1. То есть вы немедленно отказываетесь от своего лучшего решения ( DOMDocument )? Звучит многообещающе.

2. Я согласен с ответами ниже, для этого следует использовать simplexml или DOM. Но вы также не должны печатать / повторять внутри функций предварительной обработки. Вместо этого создайте переменную, которую можно использовать в шаблоне. Например, $variables['temperature'] = TEMP CODE HERE; затем в шаблоне вам просто нужно сделать <?php print $temperature; ?>

3. @Laxman13, я в курсе этого, спасибо. просто нужно было сначала посмотреть, что происходит, прежде чем переходить к tpl.php файл 🙂

Ответ №1:

Вам следует продолжить и использовать simplexml или DOM для анализа XML, а затем вы можете выполнить итерацию по результатам. В SimpleXML это выглядит следующим образом:

 $zipCode = "44418";
$url = "http://weather.yahooapis.com/forecastrss";
$zip = "?w=$zipCode";
$fullUrl = $url . $zip.'amp;u=c';
$curlObject = curl_init();
curl_setopt($curlObject,CURLOPT_URL,$fullUrl);
curl_setopt($curlObject,CURLOPT_HEADER,false);
curl_setopt($curlObject,CURLOPT_RETURNTRANSFER,true);
$returnYahooWeather = curl_exec($curlObject);
curl_close($curlObject);
//print "here". $returnYahooWeather;

$xmlobj=simplexml_load_string($returnYahooWeather);

$res = $xmlobj->xpath("//yweather:condition");
$tmp = false;
while(list( , $node) = each($res)) {
  $tmp = $node;
 }
$attribs = $tmp->attributes();
print "Temperature [".$attribs['temp']."]";
  

Комментарии:

1. спасибо, это работает, но я не понимаю, что делается в цикле while(list( , $node) = each($res)) { .. Пожалуйста, объясните, если вы не возражаете.

2. Это просто лень с моей стороны. Если бы было более одного yweather:condition элемента, то это повторило бы их все. В этом случае, где есть только 1, он просто получает этот один элемент. Я уверен, что есть способ сделать это без этого цикла, но это было быстрее, так как у меня был готовый код.

Ответ №2:

Я считаю, что проще всего SimpleXML использовать PHP.

 $xml = simplexml_load_string($returnYahooWeather);
echo $xml->Path->To->Temperature;
  

Это достаточно просто, и вы можете использовать XPath с SimpleXML :). Существуют и другие способы анализа XML, как упоминалось ранее, DOMDocument является одним из них.