[PHP] explode v XML souboru

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod infomf 11. 8. 2012 12:25

Ahoj,
mám xml soubor se seznamem produktů. Z jedněch parametrů je strom kategorií, který potřebuji rozparsovat. Vše je ok, jen když exploduji podle znaku " /" tak mě to exploduje třeba i v půlce slova.

Vstup
Kód: Vybrat vše
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
Výprodej /Mobilní telefony /GSM telefony /Volné GSM telefony /LG
Mobilní telefony /Volné GSM telefony /LG
...


Výstup
Kód: Vybrat vše
Mobiln<br>í telefony<br>Volné GSM telefony<br>LG<br><br>V<br>ýprodej<br>Mobilní telefony<br>GSM telefony<br>Volné GSM telefony<br>LG<br>

<br> vkládáno jen pro přehlednost, jinak zde je to rozdělené

Nevím proč se to tak blbě exploduje. Kódování UTF-8 všech souborů bych měl mít správně, kontroloval jsem to. Pro úplnost přidávám ještě kód PHP. Díky za rady.

Kód: Vybrat vše
<?php
header ("Content-Type : text/html; charset=UTF-8");
   include ('./include/conf.php');

  class menu_pars
  {
    var $soubor;
    var $priv_znacka="";
    var $priv_parser;
   var $struktura;
   var $id=0;
   
    function PocatecniZnacka ($parser, $nazev, $atributy){
      $this->priv_znacka=$nazev;   
   }
    function KoncovaZnacka ($parser, $nazev) {}
    function data ($parser, $data){
      if ($this->priv_znacka=="ZATRIDENI"){
        echo $data;
        $this->struktura[$this->id]=explode(" /", trim($data));
        $this->id++;
     }
    }
   
    function parse (){
      $this->priv_parser=xml_parser_create();
      xml_set_object($this->priv_parser, $this);
      xml_set_element_handler ($this->priv_parser, "PocatecniZnacka", "KoncovaZnacka");
      xml_set_character_data_handler($this->priv_parser, "data");
      if (!($obsahsouboru = fopen($this->soubor, "r"))) die("Nemohu otevřít XML pro čtení.");   
      while ($data = fread($obsahsouboru, filesize($this->soubor))) xml_parse($this->priv_parser, $data, feof($obsahsouboru));
      xml_parser_free($this->priv_parser);
    }
  }

  $menu = new menu_pars;
  $menu->soubor = "./vzor.xml";
  $menu->parse();
 
  mysql_query("TRUNCATE test");
 
  for($i=0; $i<count($menu->struktura); $i++){
      for($x=0; $x<count($menu->struktura[$i]); $x++){
         $x_=$x;
         if($x_==0){$x_=0;}else{$x_--;}
         if(mysql_num_rows(mysql_query("SELECT * FROM test WHERE jmeno='".$menu->struktura[$i][$x]."' AND nadrazena='".$x_."'"))==0){
            mysql_query("INSERT INTO `test` (`jmeno`, `nadrazena`) VALUES ('".$menu->struktura[$i][$x]."', '".$x_."');");
            echo $menu->struktura[$i][$x]."<br>";
         }
      }
  }
?>
infomf
Junior
Uživatelský avatar

Odeslat příspěvekod infomf 11. 8. 2012 15:50

Tak už vím kde vzniká problém. Když se načítají data z taku "ZATRIDENI", tak se nejprve v jednom cyklu nacte "mobiln" a v druhém "í telefony". Stejně tak i "V" a v druhém "ýprodej". Nevíte kde může být problém?
infomf
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 11. 8. 2012 16:05

takze nacitas data z xml souboru a pak je chces ukladat do db? mozna neco nechapu, ale proc to mas tak slozite? nebylo by jednodussi pouzit simplexml?
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod infomf 11. 8. 2012 16:06

Do DB to ukládám jen teď. Později to budu dále zpracovávat. nebude se jednat jen o jediný parametr, ale i o další. Ale asi jo, bude to jednoduší.

-- 11. 8. 2012 16:19 --

karlos00x píše:takze nacitas data z xml souboru a pak je chces ukladat do db? mozna neco nechapu, ale proc to mas tak slozite? nebylo by jednodussi pouzit simplexml?



PS: Musím ti poděkovat :) Dokopal jsi mě k tomu abych to přepsal. Výsledek je funkční a délka zkrácena z X řádku na 23. a je to hezčí...
infomf
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků