Vdaka nemenovanemu Berankovy som sa posunul trochu dalej. Uz mam jednoduchu triedu na parsovanie presne tak ako by som ju potreboval. Vybera data s urcitych tagov a pracuje s nimi ako s jednotlivymi premennymi, cize ich mozem jednoduchu vlkladat do SQL. Problem je, nasledovny. Pouzivam nasledovny XML file na testovanie
Code:
<?xml version="1.0" encoding="utf-8"?>
<FINANCE>
<PRIJMY>
<PRIJEM id="1">
<NAZEV>
Plat
</NAZEV>
<CASTKA>
12000
</CASTKA>
</PRIJEM>
<PRIJEM id="2">
<NAZEV>
Články na Linuxsoft
</NAZEV>
<CASTKA>
3000
</CASTKA>
</PRIJEM>
</PRIJMY>
<VYDAJE>
<VYDAJ id="1">
<NAZEV>
Byt
</NAZEV>
<CASTKA>
4500
</CASTKA>
</VYDAJ>
<VYDAJ id="2">
<NAZEV>
Jídlo
</NAZEV>
<CASTKA>
2500
</CASTKA>
</VYDAJ>
<VYDAJ id="3">
<NAZEV>
Koníčky
</NAZEV>
<CASTKA>
1500
</CASTKA>
</VYDAJ>
</VYDAJE>
</FINANCE>
Toto je trieda ktoru pouzivam na handlovanie toho XML.
Code:
<?php
// nejdřív definice třídy
class Parser
{
public $soubor;
public $bilance = 0;
public $priv_jeprijem = false;
private $priv_znacka = "";
private $priv_parser;
private function startTag($parser, $nazev, $atributy)
{
$this->priv_znacka = $nazev;
if($this->priv_znacka == "PRIJEM")
{
$this->priv_jeprijem = true;
}
if($this->priv_znacka == "VYDAJ")
{
$this->priv_jeprijem = false;
}
}
private function endTag($parser, $nazev) {}
public function data($parser, $data)
{
if($this->priv_znacka == "CASTKA" && $this->priv_jeprijem)
{
$this->bilance += $data;
}
if($this->priv_znacka == "CASTKA" && !$this->priv_jeprijem)
{
$this->bilance -= $data;
}
}
public function parse()
{
$this->priv_parser = xml_parser_create();
xml_set_object($this->priv_parser, $this);
xml_set_element_handler($this->priv_parser, "startTag", "endTag");
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, 1024))
{
xml_parse($this->priv_parser, $data, feof($obsahsouboru));
}
xml_parser_free($this->priv_parser);
}
}
// teď vlastní program
$moje_bilance = new Parser;
$moje_bilance->soubor = "./finance.xml";
$moje_bilance->parse();
echo $moje_bilance->bilance;
?>
Skratka parada. Tento script normalne vstupuje medzi tagy CASTKA a ak sa tento tag nachadza medzi tagmi PRIJEM tak pripocita dane data k premennej bilancia ak sa tag CASTKA nachadza medzi VYDAJ tak odpocita data od bilancie. Vsetko super. Teraz je to vsak problem. Prejst od testovania k realnemu vyuzitiu. Potrebujem importovat XMLka v takomto formate
http://www.morezliav.sk/xml
Tak som si naivne myslel ze mi bude stacit do definicie premennych v triede dosadit vsetky premenne ktore potrebujem, cize public $id, public $city atd atd, a lahko zmodifikovat kod asi takto(priklad uvadzam len na tahanie ID nie na cele XML).
Code:
<?php
// nejdřív definice třídy
class Parser
{
public $soubor;
public $bilance = 0;
public $priv_jeprijem = false;
private $priv_znacka = "";
private $priv_parser;
public $id;
private function startTag($parser, $nazev, $atributy)
{
$this->priv_znacka = $nazev;
if($this->priv_znacka == "DEAL")
{
$this->priv_jeprijem = true;
}
else
{
$this->priv_jeprijem = false;
}
}
private function endTag($parser, $nazev) {}
public function data($parser, $data)
{
if($this->priv_znacka == "ID" && $this->priv_jeprijem)
{
$this->id = $data;
}
}
public function parse()
{
$this->priv_parser = xml_parser_create();
xml_set_object($this->priv_parser, $this);
xml_set_element_handler($this->priv_parser, "startTag", "endTag");
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, 1024))
{
xml_parse($this->priv_parser, $data, feof($obsahsouboru));
}
xml_parser_free($this->priv_parser);
}
}
// teď vlastní program
$moje_bilance = new Parser;
$moje_bilance->soubor = "./produkty.xml";
$moje_bilance->parse();
echo $moje_bilance->id;
?>
Avsak takyto kod nezobrazi vobec nic. Ja som nikdy s XMLkom nerobil ci sa uz jedna o Ajax alebo o PHPcko. Posledne dva dni som pochopil s prace s tymto jazykom strasne moc ale stale som len na zaciatku tak prosim pomozte ak viete. A ak neviete tak dajte aspon sucitny koment 
P.S. Este som zabudol povedat, ze to zatial riesim na urovni jedneho zaznamu. Este nemam ani paru ako to priesim ked tych zaznamov tam bude viac ako je to v hore uvedenom XMLku.
EDIT: A neda sa mi pristupovat ani k jednotlivim castiam XMLka, ak triedu doplnim o public $nazov; a metodu data doplnim o
Code:
if($this->priv_znacka == "NAZEV" && $this->priv_jeprijem)
{
$this->nazov = $data;
}
a nakonci dam proste echo $moje_bilance->nazov; tak mi nic nevypise. Fakt nerozumiem ako toto cele funguje.