PHP XML parser

Jan Tichý

PHP XML parser
« kdy: 03. 09. 2010, 10:03:15 »
Dobrý den,

pracuji na webových stránkách, kde nejprve stahuji xml soubor, který obsahuje nabídku
automobilů. Data z tohoto souboru jsou skriptem parsována a následně by měla být uložena do databáze na web server. Jde o to, že vše mi funguje jak má pouze na vývojovém PC - zde když pustím skript parser_cars.php viz. níže dojde k otevření staženého xml souboru a uložení potřebných dat do databáze.

Když tento samý skript přesunu na server, kde beží PHP 5 + MySql 5, jedná se o NAS Synology DS209. Kde php funguje, ale nedaří se mi tam rozjet xml parser. Jde o to, že když pustím skript na serveru, tak nedojde k zpracování xml souboru jako na PC, ale nevypíše se ani žádná chyba. Zjistil jsem, že ve skriptu vůbec nedojde k volání funkcí, které parser má volat, když narazí na počáteční element, koncový atd. K parsování jsem použil SAX.

na této adrese je phpinfo webserveru NASu: www.tal.cz/phpinfo.php

níže uvádím část skriptu - začátek:

$soubor = "./TAL.xml";
$parser = xml_parser_create('UTF-8');
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_set_element_handler($parser, "StartElement", "EndElement");
xml_set_character_data_handler($parser, "ObsahPrvku");
$ObsahXml = file_get_contents($soubor, 0);

xml_parse($parser, $ObsahXml); //or die(chyba($parser));

function StartElement($parser, $element, $atrib)
{
....}

function EndElement($parser, $element)
{
...}

atd.
skript mi na lokálu jede...

kdyžtak mohu poslat celý skript asi na mail.

Prosím poraďte mi někdo, kde by mohl být zakopanej pes.

Děkuji
« Poslední změna: 03. 09. 2010, 10:31:38 od Petr Krčmář »


PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #1 kdy: 03. 09. 2010, 10:51:22 »
Prv daj na zaciatok skriptu:
error_reporting(E_ALL);

Potom napis co si dostal spat... nezbudni mat zapnute show_errors.
Pravdepodobne tam nemas kniznicu.

Jan Tichý

Re: PHP XML parser
« Odpověď #2 kdy: 03. 09. 2010, 15:20:45 »
na začátek skriptu jsem přidal
error_reporting(E_ALL);

dále jsem do php.ini přidal
show_errors = On

jinak je tam nastavení
display_errors = On, takže by to chyby vypisovat mělo.

ale ani po těchto úpravách mi to nic nenapsalo.
 
Chtěl bych se zeptat, jakou knihovnu mám případně shánět a jak jí přidám ?
Jsem v tom začátečník (linux, php, apache).

Děkuji za odpověď 

PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #3 kdy: 03. 09. 2010, 15:32:14 »
Posli mi teda ten skript ako spravu + nejake template xml.
Pozri sa ake moduly mas do php5 nainstallovane a tie iste daj aj na ten stroj.

Jan Tichý

Re: PHP XML parser
« Odpověď #4 kdy: 03. 09. 2010, 16:49:43 »
dáš mi mail, kam bych ti to mohl poslat jako přílohu .zip (xml + skript) ?


PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #5 kdy: 03. 09. 2010, 16:51:34 »

Jan Tichý

Re: PHP XML parser
« Odpověď #6 kdy: 09. 09. 2010, 17:39:24 »
Vyřešeno, skript přepsán pro rozhraní SimpleXML a valí to...

Nevíte, jak je to s nastavením a podporou encoding, když mu pošlu .xml v UTF-8 no problem.
Když ho pošlu ve windows-1250, tak chyba:

Warning: simplexml_load_file() [function.simplexml-load-file]: TAL.xml:1: parser error : Unsupported encoding windows-1250

na linuxovém systému NASu si s windows-1250 asi neškrtnu co ?

Díky

 


PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #7 kdy: 09. 09. 2010, 17:46:56 »
Na tvoj skript som zatial :| nemal cas, ale s tymto ti mozno pomoct viem :)

mb_convert_encoding ;)

PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #8 kdy: 09. 09. 2010, 17:47:41 »
Alebo utf8_encode ;)

PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #9 kdy: 09. 09. 2010, 20:48:55 »
Pomohlo?

Jan Tichý

Re: PHP XML parser
« Odpověď #10 kdy: 11. 09. 2010, 13:04:00 »
Jsem teď mimo,

v úterý to vyzkouším a dám vědět...

Děkuji moc.

Jan Tichý

Re: PHP XML parser
« Odpověď #11 kdy: 13. 09. 2010, 20:51:39 »
no mě vadí v tom xml souboru kódování windows-1250 viz. xml:

<?xml version="1.0" encoding="windows-1250" ?>
<cars xmlns:xs="http://www.w3.org/2001/XMLSchema" >

když tam dám UTF-8, tak mi to jde.
Potom nastupuje funkce $xml = simplexml_load_file("TAL.xml"); která z xml udělá
strom objektů. 

Nejde to nějak jednoduše uložit do UTF-8 ?

Podle popisu té funkce utf8_encode jsem pochopil, že dostává string v kódování ISO-8859-1
a vrací UTF, ale jak to realizovat ?
Projít celý soubor např. takto:
 
$obsahSouboru = fopen($soubor, "r");
while ($data = fread($obsahSouboru, 5) {
...
  utf8_encode($data);
... atd.
}

po kusech překódovat a uložit do nového souboru v utf ? 


Díky


PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #12 kdy: 14. 09. 2010, 01:15:27 »
ano... prezen tym cely subor... napriklad takouto funkciou:

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

Jan Tichý

Re: PHP XML parser
« Odpověď #13 kdy: 20. 09. 2010, 18:18:57 »
už mi funguje načítání konvertovaného souboru, ale
kdyz cely soubor uložim znovu do utf-8, potom v tomto souboru chybí znaky s diakritikou.
V podstatě veškeré znaky ě,š,č,ř,ž... atd,

použil jsem tento kód:
$obsah = "<?xml version='1.0' encoding='UTF-8' ?>";
   
    $InFile = fopen("TAL.xml","r") or die("Soubor nelze otevrit");
    $radek = fgets($InFile, 500);
     
    while (! feof($InFile))
    {
      $data = fread($InFile, 1);       
      $obsah .= correct_encoding($data);
    }
    fclose($InFile);       
   
    $OutFile = FOpen ('nabidka.xml',"w");
    fwrite($OutFile,$obsah);
    FClose ($OutFile);

Prosím poraďte, kde může být problem...

PCnity

  • *****
  • 680
    • Zobrazit profil
    • E-mail
Re: PHP XML parser
« Odpověď #14 kdy: 20. 09. 2010, 20:48:18 »
tipujem to na tento riadok: mb_detect_encoding($text, 'auto');