DOM doc-> több lekérdezés egyszerre ???

DOM doc-> több lekérdezés egyszerre ???
2009-03-05T18:59:46+01:00
2009-03-06T17:34:54+01:00
2022-11-12T20:00:37+01:00
Gexa
Sziasztok!

Lenne egy óriási problémám, mégpedig az, hogy egy összetett keresést kellene elvégezzek PHP segítségével egy XML fájlban. Ennek struktúrája az alábbi:

<gid id="722437">
<PointName><![CDATA[Bekescsaba]]></PointName>
<Current>
<PointDesc><![CDATA[Tiszta idő]]></PointDesc>
<icon><![CDATA[1N]]></icon>
<PointName><![CDATA[Bekescsaba]]></PointName>
<Humidity><![CDATA[66 %]]></Humidity>
<Temperature><![CDATA[11 C]]></Temperature>
<Visibility><![CDATA[> 10000m ]]></Visibility>
<Pressure><![CDATA[986.1 mb ]]></Pressure>
<Wind><![CDATA[30 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</Current>
<Summary>
<date><![CDATA[Ma ]]>
<PointDesc><![CDATA[Esik az eső]]></PointDesc>
<icon><![CDATA[7]]></icon>
<minHum><![CDATA[87 %]]></minHum>
<maxHum><![CDATA[91 %]]></maxHum>
<minTemp><![CDATA[6 C]]></minTemp>
<maxTemp><![CDATA[7 C]]></maxTemp>
<Wind><![CDATA[18 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</date>
<date><![CDATA[6/3/2009]]>
<PointDesc><![CDATA[Enyhe eső]]></PointDesc>
<icon><![CDATA[6]]></icon>
<minHum><![CDATA[74 %]]></minHum>
<maxHum><![CDATA[95 %]]></maxHum>
<minTemp><![CDATA[6 C]]></minTemp>
<maxTemp><![CDATA[11 C]]></maxTemp>
<Wind><![CDATA[16 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</date>
... Stb.
</Summary>
6vagy 7 nap van így felsorolva városonként (szóval szép hosszú a file).

Itt úgy szereném, hogy kiválasztok 6db várost és azoknak az adatait lekérdezem a nevükkel együtt. Én így próbáltam, de ez nem jó, mert a PointName így nem lesz benne a tömbbe (az visoznt nagyon kellene nekem):
$dom = new DomDocument();
$dom->load('documents/weather/weather.xml');
$varos = atnevez_back($_POST['varos']);
$xp = new Domxpath($dom);
$result = $xp->query("//gid[contains(PointName,'Szombathely') or contains(PointName, 'Gyor') or contains(PointName, 'Budapest') or contains(PointName, 'Bekescsaba') or contains(PointName, 'Nyiregyhaza') or contains(PointName, 'Baja')]/Summary/date");

Előre is köszönöm mindenkinek!!

Üdv,
Gexa
Mutasd a teljes hozzászólást!
1. Az utolsó kérdésedre:

ezután a gid -nél vagyok:
$varosneve = $varos->parentNode->parentNode


akkor így:
$varosneve = $varos->parentNode->parentNode->firstChild->nodeValue;


2. query átalakítása


$result = $xp->query("//gid[contains(PointName,'Szombathely')/PointName | $result = $xp->query("//gid[contains(PointName,'Szombathely')/Summary/date");

Ez elég hosszú lesz és ráadásul 2x keres.

3. query átalakítása és lépegetés

$result = $xp->query("//gid[contains(PointName,'Szombathely')"); foreach ($result as $varos) { if ($varos->nodeName == "PointName") { $varosneve = $varos->nodeValue; { .... További adathalászat.... switch vagy if vagy ... }
4. Úgy értelmezem, hogy Te alakítod ki az XML felépítését is.

Akkor inkább így tenneém (pl.:)

<root>
<gid id="722437">
<PointName><![CDATA[Bekescsaba]]>
<Current>
<PointDesc><![CDATA[Tiszta idő]]></PointDesc>
<icon><![CDATA[1N]]></icon>
<Humidity><![CDATA[66 %]]></Humidity>
<Temperature><![CDATA[11 C]]></Temperature>
<Visibility><![CDATA[> 10000m ]]></Visibility>
<Pressure><![CDATA[986.1 mb ]]></Pressure>
<Wind><![CDATA[30 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</Current>
<Summary>
<date><![CDATA[Ma ]]>
<PointDesc><![CDATA[Esik az eső]]></PointDesc>
<icon><![CDATA[7]]></icon>
<minHum><![CDATA[87 %]]></minHum>
<maxHum><![CDATA[91 %]]></maxHum>
<minTemp><![CDATA[6 C]]></minTemp>
<maxTemp><![CDATA[7 C]]></maxTemp>
<Wind><![CDATA[18 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</date>
<date><![CDATA[6/3/2009]]>
<PointDesc><![CDATA[Enyhe eső]]></PointDesc>
<icon><![CDATA[6]]></icon>
<minHum><![CDATA[74 %]]></minHum>
<maxHum><![CDATA[95 %]]></maxHum>
<minTemp><![CDATA[6 C]]></minTemp>
<maxTemp><![CDATA[11 C]]></maxTemp>
<Wind><![CDATA[16 kph]]></Wind>
<windDirection><![CDATA[DK]]></windDirection>
</date>
</Summary>
</PointName>
</gid>
</root>

És akkor simán csak a parent-ekkel tudnál hivatkozni.

...
....
.....

:)

Szerk.: az utolsónál szépen elrendezgettem, de eltűnt... :S
Mutasd a teljes hozzászólást!

  • Hát nem igazán értjük miről van szó, viszont komplikáltabb xml-es kérdésekre sokszor érdemes xslt-t használni.
    Mutasd a teljes hozzászólást!
  • Szia!
    Annyi lenne a dolog, hogy:
    Miután így lekérdeztem a Query-vel az adatokat, sajnos nem tudom kinyerni a "PointName" változót.
    tehát:

    foreach ($result as $varos) {
    // Nah szóval, itt kellene valahogy visszajussak a "PointName" értékéhez, csak nem tudom, hogy hogyan
    $varosneve = $varos->parentNode->parentNode->firstChild->nodeValue;
    print $varosneve;

    // Itt kiírom fájlba a többi dolgot, ez most nem számít
    $f = fopen($gen_file, 'a');
    $target='<?=$weather_target;?>';
    fwrite($f, ElemIras($varos, $target));
    fclose($f);
    }

    így remélem, hogy jobb egy fokkal!!

    Üdv,
    Gexa
    Mutasd a teljes hozzászólást!
  • Egy gid, mit tartalmaz?
    Folyamatosan beleöntve minden vagy egy-egy helységnév?
    Biztos hogy mindegyikhez van Summary?
    Aba és Abasár esetén pl. nem hozza mindkettőt?

    Mivel a PointName nincs szülő->leszármazott viszonyban ezért inkább a previousSibling-et ejánlanám. :)
    Mutasd a teljes hozzászólást!
  • Szia!
    a gid a város "id"-jét tartalmazza. Nem használom semmire mert fölösleges, de azért jó ha van! :) (egyszer lehet kell majd)

    Amúgy nem az a baj, hanem hogy a $varos változóm csak a <date> </date> közötti elemeket tartalmazza és nem tudom, hogy innen hogyan lépjek vissza, hogy kinyerjem a város nevét. Én is valami "previous" dologra gondoltam, de majd kipróbálom.

    ezután a gid -nél vagyok:
    $varosneve = $varos->parentNode->parentNode...

    innen, hogy tudnék a PointName értékére lépni, az lenne a kérdés... ???

    Köszi!

    Üdv


    Mutasd a teljes hozzászólást!
  • 1. Az utolsó kérdésedre:

    ezután a gid -nél vagyok:
    $varosneve = $varos->parentNode->parentNode


    akkor így:
    $varosneve = $varos->parentNode->parentNode->firstChild->nodeValue;


    2. query átalakítása


    $result = $xp->query("//gid[contains(PointName,'Szombathely')/PointName | $result = $xp->query("//gid[contains(PointName,'Szombathely')/Summary/date");

    Ez elég hosszú lesz és ráadásul 2x keres.

    3. query átalakítása és lépegetés

    $result = $xp->query("//gid[contains(PointName,'Szombathely')"); foreach ($result as $varos) { if ($varos->nodeName == "PointName") { $varosneve = $varos->nodeValue; { .... További adathalászat.... switch vagy if vagy ... }
    4. Úgy értelmezem, hogy Te alakítod ki az XML felépítését is.

    Akkor inkább így tenneém (pl.:)

    <root>
    <gid id="722437">
    <PointName><![CDATA[Bekescsaba]]>
    <Current>
    <PointDesc><![CDATA[Tiszta idő]]></PointDesc>
    <icon><![CDATA[1N]]></icon>
    <Humidity><![CDATA[66 %]]></Humidity>
    <Temperature><![CDATA[11 C]]></Temperature>
    <Visibility><![CDATA[> 10000m ]]></Visibility>
    <Pressure><![CDATA[986.1 mb ]]></Pressure>
    <Wind><![CDATA[30 kph]]></Wind>
    <windDirection><![CDATA[DK]]></windDirection>
    </Current>
    <Summary>
    <date><![CDATA[Ma ]]>
    <PointDesc><![CDATA[Esik az eső]]></PointDesc>
    <icon><![CDATA[7]]></icon>
    <minHum><![CDATA[87 %]]></minHum>
    <maxHum><![CDATA[91 %]]></maxHum>
    <minTemp><![CDATA[6 C]]></minTemp>
    <maxTemp><![CDATA[7 C]]></maxTemp>
    <Wind><![CDATA[18 kph]]></Wind>
    <windDirection><![CDATA[DK]]></windDirection>
    </date>
    <date><![CDATA[6/3/2009]]>
    <PointDesc><![CDATA[Enyhe eső]]></PointDesc>
    <icon><![CDATA[6]]></icon>
    <minHum><![CDATA[74 %]]></minHum>
    <maxHum><![CDATA[95 %]]></maxHum>
    <minTemp><![CDATA[6 C]]></minTemp>
    <maxTemp><![CDATA[11 C]]></maxTemp>
    <Wind><![CDATA[16 kph]]></Wind>
    <windDirection><![CDATA[DK]]></windDirection>
    </date>
    </Summary>
    </PointName>
    </gid>
    </root>

    És akkor simán csak a parent-ekkel tudnál hivatkozni.

    ...
    ....
    .....

    :)

    Szerk.: az utolsónál szépen elrendezgettem, de eltűnt... :S
    Mutasd a teljes hozzászólást!
  • Szia!

    Nah igen, valami ilyesmire gondoltam, csak nem tudtam, hogy hogyan vannak az operátorok a query-ben meg ilyenek

    Amúgy nem én csináltam sajnos a struktúrát, hanem így kapom... értelem szerűen akkor nem bajlódtam volna vele

    Köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd