簡體   English   中英

用xpath PHP過濾xml datetime屬性

[英]Filter xml datetime attribute with xpath PHP

我正在嘗試僅基於屬性檢索xml的某些值。 我想遍歷所有值,僅根據“分鍾”獲得一個特定值。

這是我正在使用的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代碼

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函數,但無法想象如何使用該函數來完成此操作,如果還有其他方法,我將很樂意嘗試。

非常感謝

- - - - - - - - - - - - - - 編輯 - - - - - - - - - - - -------

通過這種解決方法,我可以實現所需的功能,但是我想知道是否存在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;

您可以使用XPath而不是遍歷所有<Valores>

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

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

XPath上方是不言自明的:它搜索包含子字符串“:30:00”的類“ data”的<Valores>節點。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM