Autor Zpráva
Ecrazit
Profil *
Zdravím, snažím se napsat PHP parser, který mi přečte údaje o počasí z XML souboru. Kód mám napsaný, ale nefunguje mi výpis posledních 3 polí. Vypíše mi to pole $datum[] a $den[], ale už mi to nevypíše pole $teplota_max[], $teplota_min[] a $stav[]. Jedná se o pole vytvářené ve funkci znaky().

XML soubor:
<?xml version="1.0" encoding="UTF-8"?>
<pocasi>
 <benesov> 
    <predpoved den="10.3." id_dne="0" nazev_dne="Sobota">
      <stav>4</stav> 
      <teplota_max>9</teplota_max>
      <teplota_min>-1</teplota_min>
    </predpoved>
    <predpoved den="11.3." id_dne="1" nazev_dne="Neděle">
      <stav>10</stav> 
      <teplota_max>8</teplota_max>
      <teplota_min>2</teplota_min>
    </predpoved>
    <predpoved den="12.3." id_dne="2" nazev_dne="Pondělí">
      <stav>10</stav> 
      <teplota_max>8</teplota_max>
      <teplota_min>3</teplota_min>
    </predpoved>
    <predpoved den="13.3." id_dne="3" nazev_dne="Úterý">
      <stav>4</stav> 
      <teplota_max>10</teplota_max>
      <teplota_min>4</teplota_min>
    </predpoved>
 </benesov>
 <cr_vyhled>
    <predpoved den="14.3." id_dne="4" nazev_dne="Středa">
      <stav>4</stav> 
      <teplota_max>11</teplota_max>
      <teplota_min>3</teplota_min>
    </predpoved>
    <predpoved den="15.3." id_dne="5" nazev_dne="Čtvrtek">
      <stav>3</stav> 
      <teplota_max>12</teplota_max>
      <teplota_min>3</teplota_min>
    </predpoved>
    <predpoved den="16.3." id_dne="6" nazev_dne="Pátek">
      <stav>3</stav> 
      <teplota_max>15</teplota_max>
      <teplota_min>4</teplota_min>
    </predpoved>
    <predpoved den="17.3." id_dne="7" nazev_dne="Sobota">
      <stav>4</stav> 
      <teplota_max>15</teplota_max>
      <teplota_min>5</teplota_min>
    </predpoved>
 </cr_vyhled>
</pocasi>

PHP soubor:
<?php 
$soubor = 'pocasi.xml';
$size = filesize($soubor);
$id = '';
$datum = array();
$den = array();
$stav = array();
$teplota_min = array();
$teplota_max = array();
$znacka = '';
$parser = xml_parser_create();

function start ($parser, $nazev, $atributy) {
    global $id, $datum, $den, $znacka;
    if ($nazev == 'PREDPOVED') {
        $id = $atributy['ID_DNE'] + 1;
        $datum[$id] = $atributy['DEN'];
        $den[$id] = $atributy['NAZEV_DNE'];
    }
    if ($nazev == 'STAV') $znacka = 'stav';
    if ($nazev == 'TEPLOTA_MAX') $znacka = 'max';
    if ($nazev == 'TEPLOTA_MIN') $znacka = 'min';
}

function finish ($parser, $nazev) {}

function texty ($parser, $data) {
    global $id, $znacka, $stav, $teplota_max, $teplota_min;
    if ($znacka == 'stav') $stav[$id] = $data;
    if ($znacka == 'max') $teplota_max[$id] = $data;
    if ($znacka == 'min') $teplota_min[$id] = $data;
}

xml_set_element_handler($parser, 'start', 'finish');
xml_set_character_data_handler($parser, 'texty');

if(!($soubor = fopen($soubor, "r"))) {
    die("Nelze otevřít soubor XML!!");
} 
else while ($d = fread($soubor, $size)) { 
    if (!xml_parse($parser, $d, feof($soubor))) die("Vyskytla se chyba v XML!");
}

xml_parser_free($parser);

// Odtudd vypisuji výsledky

echo $den[1];
echo $datum[3];
echo $stav[1];
echo $teplota_min[5];
echo $teplota_max[1];
?>
Majkl578
Profil
Co znamená nefunguje?

Ten kód je hrozný (viz global nebo ten zastaralý způsob čtení XML). Proč nepoužiješ nějaké lepší a novodobější řešení, například DOM nebo SimpleXML?
Ecrazit
Profil *
Teprve se PHP učím a tohle je způsob z jednoho seriálu. Nefunguje znamená, že pole na konci skriptu jsou prázdní, ikdyž by měli obsahovat údaje o teplotách...
Alphard
Profil
<?php
$weather = simplexml_load_file('data/xml_01.xml');

foreach ($weather->cr_vyhled->predpoved as $day) 
{
    $a = $day->attributes(); 
    echo $a->nazev_dne, ' ', $a->den, ': ', $day->teplota_min, ' - ', $day->teplota_max, PHP_EOL;
}

Váš seriál vyhoďte.
Ecrazit
Profil *
Jo tak to je něco uplne jinyho, díky :) bohuzel ale OOP vůbec neumím. Doporučil by mi někdo nějaký seriál, kde bych se naučil alespon základy OOP v PHP?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: