2016-03-30 4 views
1

Я пытаюсь получить только определенные значения xml на основе атрибута. Я хочу перебирать все значения и получать только конкретную информацию на основе «минуты».Фильтр xml атрибут datetime с xpath PHP

Это XML, что я работаю с:

XML

<Valores Data="30/03/2016 0:10:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,48" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="179" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 0:20:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,3" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="180" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 0:30:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,18" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="180" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 0:40:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="184" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 0:50:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="2,53" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="184" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:00:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,14" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="181" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:10:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,46" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="185" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:20:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,51" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="184" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:30:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="3,23" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="185" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:40:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="2,43" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="206" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 
<Valores Data="30/03/2016 1:50:00"> 
<Medida ID="81" Variable="Velocidade do Vento" Unidades="m/s" Valor="2,46" Codigo_validacion="1"/> 
<Medida ID="82" Variable="Dirección do Vento" Unidades="Graos" Valor="205" Codigo_validacion="1"/> 
<Medida ID="10001" Variable="Chuvia" Unidades="L/m2" Valor="0" Codigo_validacion="1"/> 
</Valores> 

С помощью этого кода PHP можно перебрать все элементы и извлекать данные, которые я хочу:

PHP CODE

foreach ($mypix->Valores as $valores): 
    foreach ($valores as $pixinfo): 
     if ($pixinfo['ID'] == VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $vel_viento = $pixinfo['Valor']; 
     } 
     if ($pixinfo['ID'] == DIR_VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $dir_viento = $pixinfo['Valor']; 
     } 
     if ($pixinfo['ID'] == LLUVIA && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $lluvia = $pixinfo['Valor']; 
     } 
    endforeach; 
    echo "v_viento: " . $vel_viento . " d_viento: " . $dir_viento . " lluvia: " . $lluvia . "<br>"; 
endforeach; 

С этим моего выходом прекрасно подходит, но он извлекает все значения:

ВЫВОДА

v_viento: 3,48 d_viento: 179 lluvia: 0 
v_viento: 3,3 d_viento: 180 lluvia: 0 
v_viento: 3,18 d_viento: 180 lluvia: 0 
v_viento: 3 d_viento: 184 lluvia: 0 
v_viento: 2,53 d_viento: 184 lluvia: 0 
v_viento: 3,14 d_viento: 181 lluvia: 0 
v_viento: 3,46 d_viento: 185 lluvia: 0 
v_viento: 3,51 d_viento: 184 lluvia: 0 
v_viento: 3,23 d_viento: 185 lluvia: 0 
v_viento: 2,43 d_viento: 206 lluvia: 0 
v_viento: 2,46 d_viento: 205 lluvia: 0 

Но я хочу сейчас сделать, это фильтр и получить только те значения, на полчаса. Я просто хочу вывести значения на 30/03/2016 *: 30: 00

Я пытаюсь с множественными подходами, но никто не убедил меня достаточно, я видел функцию xpath, но не могу себе представить как я могу это сделать, используя эту функцию, также, если есть еще один способ, я буду рад попробовать.

Спасибо большое

---------------------------- EDIT -------- --------------------

С этим обходным путем я сделал то, что хочу, но хочу знать, есть ли возможность xpath для этого.

foreach ($mypix->Valores as $valores): 
    $fecha1 = $valores['Data']; 
    if (date('i:s', strtotime(str_replace('/', '-', $fecha1))) == '30:00') { 
     foreach ($valores as $pixinfo): 
      if ($pixinfo['ID'] == VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
       $vel_viento = $pixinfo['Valor']; 
      } 
      if ($pixinfo['ID'] == DIR_VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
       $dir_viento = $pixinfo['Valor']; 
      } 
      if ($pixinfo['ID'] == LLUVIA && $pixinfo['Codigo_validacion'] == COD_VAL) { 
       $lluvia = $pixinfo['Valor']; 
      } 
     endforeach; 
     echo "v_viento: " . $vel_viento . " d_viento: " . $dir_viento . " lluvia: " . $lluvia . "<br>"; 
    } 
endforeach; 

ОТВЕТ

Я предоставлю полный ответ, благодаря решению, предоставленной @ fusion3k

$filtered = $mypix->xpath('//Valores[contains(@Data,":30:00")]'); 
foreach ($filtered as $valores): 
    foreach ($valores as $pixinfo): 
     if ($pixinfo['ID'] == VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $vel_viento = $pixinfo['Valor']; 
     } 
     if ($pixinfo['ID'] == DIR_VIENTO && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $dir_viento = $pixinfo['Valor']; 
     } 
     if ($pixinfo['ID'] == LLUVIA && $pixinfo['Codigo_validacion'] == COD_VAL) { 
      $lluvia = $pixinfo['Valor']; 
     } 
    endforeach; 
    echo "v_viento: " . $vel_viento . " d_viento: " . $dir_viento . " lluvia: " . $lluvia . "<br>"; 
endforeach; 

ответ

0

Вы можете использовать XPath вместо перебора всех <Valores>:

$filtered = $mypix->xpath('//Valores[contains(@Data,":30:00")]'); 

foreach($filtered as $valores): 
(...) 
endforeach; 

Над XPath не требует пояснений: он ищет для <Valores> узлов с классом «данные», который содержит подстроку «: 30: 00».


+0

Как показывают, это довольно просто, спасибо! – neteot

Смежные вопросы