Извлечение элемента с именем time в SimpleXML

0

Я извлек XML-документ с внешнего сайта, используя file_get_contents(). В XML есть запись "время". (Это не содержит текущего реального времени). Вот пример XML-документа, показывающий структуру:

<?xml version="1.0" encoding="utf-8"?>
<weatherdata>
  <location>
    <name>New York</name>
    <type/>
    <country>US</country>
    <timezone/>
    <location altitude="0" latitude="40.714272" longitude="-74.005966" geobase="geonames" geobaseid="0"/>
  </location>
  <credit/>
  <meta>
    <lastupdate/>
    <calctime>0.3297</calctime>
    <nextupdate/>
  </meta>
  <sun rise="2015-02-18T11:45:10" set="2015-02-18T22:34:36"/>
  <forecast>
    <time day="2015-02-18">
      <symbol number="600" name="light snow" var="13d"/>
      <precipitation value="0.35" type="snow"/>
      <windDirection deg="162" code="SSE" name="South-southeast"/>
      <windSpeed mps="3.26" name="Light breeze"/>
      <temperature day="26.26" min="0.19" max="26.26" night="12.31" eve="14.38" morn="0.19"/>
      <pressure unit="hPa" value="1003.66"/>
      <humidity value="60" unit="%"/>
      <clouds value="clear sky" all="0" unit="%"/>
    </time>
    <time day="2015-02-19">
      <symbol number="600" name="light snow" var="13d"/>
      <precipitation value="0.5" type="snow"/>
      <windDirection deg="306" code="NW" name="Northwest"/>
      <windSpeed mps="9.53" name="Fresh Breeze"/>
      <temperature day="16.59" min="2.39" max="16.59" night="2.39" eve="8.37" morn="13.95"/>
      <pressure unit="hPa" value="1000.78"/>
      <humidity value="45" unit="%"/>
      <clouds value="scattered clouds" all="44" unit="%"/>
    </time>
    <time day="2015-02-20">
      <symbol number="800" name="sky is clear" var="01d"/>
      <precipitation/>
      <windDirection deg="308" code="NW" name="Northwest"/>
      <windSpeed mps="10.07" name="Fresh Breeze"/>
      <temperature day="13.5" min="0.48" max="14.29" night="0.48" eve="10.08" morn="1.04"/>
      <pressure unit="hPa" value="1016.68"/>
      <humidity value="41" unit="%"/>
      <clouds value="clear sky" all="0" unit="%"/>
    </time>
    <time day="2015-02-21">
      <symbol number="601" name="snow" var="13d"/>
      <precipitation value="8.75" type="snow"/>
      <windDirection deg="138" code="SE" name="SouthEast"/>
      <windSpeed mps="3.93" name="Gentle Breeze"/>
      <temperature day="17.87" min="-6.41" max="30.97" night="30.97" eve="24.13" morn="-6.41"/>
      <pressure unit="hPa" value="1035.89"/>
      <humidity value="0" unit="%"/>
      <clouds value="broken clouds" all="65" unit="%"/>
    </time>
    <time day="2015-02-22">
      <symbol number="600" name="light snow" var="13d"/>
      <precipitation value="0.05" type="snow"/>
      <windDirection deg="289" code="WNW" name="West-northwest"/>
      <windSpeed mps="12.12" name="Strong breeze"/>
      <temperature day="30.6" min="16.48" max="33.58" night="16.48" eve="23.45" morn="33.58"/>
      <pressure unit="hPa" value="1021.45"/>
      <humidity value="0" unit="%"/>
      <clouds value="clear sky" all="0" unit="%"/>
    </time>
    <time day="2015-02-23">
      <symbol number="600" name="light snow" var="13d"/>
      <precipitation value="0.86" type="snow"/>
      <windDirection deg="297" code="WNW" name="West-northwest"/>
      <windSpeed mps="3.35" name=""/>
      <temperature day="19.4" min="11.91" max="19.4" night="15.69" eve="11.91" morn="13.69"/>
      <pressure unit="hPa" value="1032.5"/>
      <humidity value="0" unit="%"/>
      <clouds value="few clouds" all="20" unit="%"/>
    </time>
    <time day="2015-02-24">
      <symbol number="601" name="snow" var="13d"/>
      <precipitation value="12.36" type="snow"/>
      <windDirection deg="71" code="ENE" name="East-northeast"/>
      <windSpeed mps="8.08" name="Fresh Breeze"/>
      <temperature day="24.73" min="18.99" max="25.95" night="23.5" eve="25.95" morn="18.99"/>
      <pressure unit="hPa" value="1014.9"/>
      <humidity value="0" unit="%"/>
      <clouds value="overcast clouds" all="100" unit="%"/>
    </time>
  </forecast>
</weatherdata>

Я попытался получить элемент времени таким образом:

$xml->forecast->time[day]

Но это возвращает текущую дату. Я предполагаю, что это из-за функции PHP time(). Поэтому я больше не могу обрабатывать дерево XML следующим образом:

<?php
$xmlString = file_get_contents("http://api.openweathermap.org/data/2.5/forecast/daily?q=New York&mode=xml&units=imperial&cnt=7");
$xml = new SimpleXMLElement($xmlString);
$loc = $xml->location->name.", ".$xml->location->country;
$day1 = date('Y-m-d', strtotime('+1 day'));
echo $xml->forecast->time[day1]->symbol['name'];
  • 0
    Используйте функцию simplexml_load_file ()
Теги:

2 ответа

2
Лучший ответ

Во-первых, вам нужно использовать $day1 не day1. Вы пропустили $.

Имея это, вы можете использовать xpath для поиска соответствующей записи:

$xml->forecast->xpath("//time[@day='$day1']")[0]->symbol['name'];

Проверьте страницу руководства о методе xpath(): http://php.net/manual/en/simplexmlelement.xpath.php и узнайте о XPath в целом.

  • 0
    Хорошо, похоже, у меня есть решение, спасибо, приятель.
1

Не совсем уверен, понимаю ли я, что вы хотите, но вот как вы получаете все имена для всех дат в xml:

foreach ($xml->forecast->time as $day){
    echo $day->symbol["name"]."<br />";
}

Выходы:

light snow
light snow
sky is clear
snow
light snow
light snow
snow

Ещё вопросы

Сообщество Overcoder
Наверх
Меню