Portál AbcLinuxu, 30. dubna 2025 21:23

PHP-4 díl:parsování xml

10.8.2007 11:47 | Přečteno: 5106× | Linux | poslední úprava: 10.8.2007 14:30

Již delší dobu jsem nic nenapsal o mých zkušenostech s PHP. Jak je z nadpisu partné zkoušel jsem parsování XML v PHP, ale nějak mi to nevychází.

Na parsování jsem si vytvořil jednoduchý soubor XML:

<?xml version="1.0" encoding="UTF-8"?>
<apcpinstall>
<type>component</type>
<name>test</name>
<author>Filip Bartmann</author>
<e-mail>xxx@yyy.info</e-mail>
<license>GNU-GPL</license>
<sql type="install">CREATE TABLE #__test (test_id int(5) NOT NULL auto_increment, test_name mediumtext NOT NULL, PRIMARY KEY(test_id))</sql>
<sql type="uninstall">DROP TABLE #_test</sql>
<files>
<file id="main">test.php</file>
<file id="menu">menu.php</file>
<file id="lang">cs_CZ.utf8</file>
<file id="lang">en_GB.utf8</file>
</files>
</apcpinstall>

Kód pársuji pomocí této třídy:

class xmlparse {
	public $langs=Array();

	function begin($parser, $name, $attr) {
		$this->xml = $name;
		$this->attr = $attr;
		$this->pd = 0;
	}

	function stop($parser, $name) {
		if ($name == "apcpinstall") {
			switch ($this->type) {
				case "component":
					$sql = "INSERT INTO #__components SET comp_name=\"".$this->name."\", comp_url=\"com=".$this->name."\", comp_include=\"".$this->name."/".$this->main."\", comp_menu=\"".$this->name."/".$this->menu."\",core=0";
					//dbcon($sql);
					break;
				default:
					break;
			}
		}
	}

	function data($parser, $data) {
		if ($this->pd == 0) {
                 echo $this->xml." ".$data."<br>";
			switch ($this->xml) {
				case "type" :
					if ($data == "component") {
						$this->type = "component";
					}
					break;
				case "name" :
					$this->name = $data;
				case "sql" :
					if (isset ($this->attr["type"])) {
						if ($this->attr["type"] == "install") {
							//dbcon($data);
						}
					}
					break;
				case "file" :
					switch ($this->attr["id"]) {
						case "main" :
							$this->main = $data;
							break;
						case "menu" :
							$this->menu = $data;
						case "lang" :
							array_push($this->langs,$data);
						default :
							break;
					}
					break;
				default :
					break;
			}
			$this->pd++;
		}
	}

	function parse($cname) {
		global $basePath;
		$this->parser = xml_parser_create();
		xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
		xml_set_object($this->parser, $this);
		xml_set_element_handler($this->parser, "begin", "stop");
		xml_set_character_data_handler($this->parser, "data");
		if (file_exists($basePath.'/tmp/install/'.basename($_FILES["comp"]["tmp_name"]).'/'.$cname.'/install.xml')) {
			$xmlfile = fopen($basePath.'/tmp/install/'.basename($_FILES["comp"]["tmp_name"]).'/'.$cname.'/install.xml', "r");
			if (!$xmlfile) {
				echo "Soubor install.xml se nepodařilo otevřít<br/>";
				return 0;
			} else {
				while ($xmldata = fread($xmlfile, filesize($basePath.'/tmp/install/'.basename($_FILES["comp"]["tmp_name"]).'/'.$cname.'/install.xml'))) {
					xml_parse($this->parser, $xmldata);
				}
				xml_parser_free($this->parser);
				$files=Array($this->main, $this->menu, $this->langs);
				return $files;
			}
		} else {
			echo "Soubor install.xml neexistuje<br>";
			return 0;
		}
	}
}

Když si dám hodnoty vytisknout pomocí řádku zvýrazněného kurzívou zobrazí se mi toto:

apcpinstall
type component
type
name test
name
author Filip Bartmann
author
e-mail xxx@yyy.info
e-mail
license GNU-GPL
license
sql CREATE TABLE #__test (test_id int(5) NOT NULL auto_increment, test_name mediumtext NOT NULL, PRIMARY KEY(test_id))
sql
sql DROP TABLE #_test
sql
files
file test.php
file
file menu.php
file
file cs_CZ.utf8
file
file en_GB.utf8
file
file

A tady je ten problém. Nemůžu zjistit proč se mi zdvojují ty otevírací tagy, tedy proč tam mám jednou type component a podruhé samotné type? Provizorně jsem to vyřešil pomocí řádků zvýrazněných tučně, ale vím, že je to špatné řešení a také bych se to docela rád naučil správně.

Druhý problém je, proč se mi v poli files v podpoli langs objevuju menu.php, když ho tam vůbec nedávám:

Array ( [0] => test.php [1] => menu.php [2] => Array ( [0] => menu.php [1] => cs_CZ.utf8 [2] => en_GB.utf8 ) )

Nemůžu přijít na to, kde mám chybu. Mohl byste mi někdo poradit co dělám špatně? Předem děkuji.

       

Hodnocení: 25 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

10.8.2007 12:09 Lu-Tze | skóre: 15 | blog: Lu-Tzeho blog
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Odpovědět | Sbalit | Link | Blokovat | Admin
Nepoužíváš existující knihovny, to je to co děláš špatně. Vo tom tak nějak dneska to programování je.
10.8.2007 12:14 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Jaké to jsou? U parsování xml v PHP jsem našel ještě nějakou hotovou třídu, ale píšou tam, že je teprve v CVS:-(
freshmouse avatar 10.8.2007 12:16 freshmouse | skóre: 42 | blog: Bruno Banány
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
SimpleXML je v PHP 5.
10.8.2007 13:34 Creckx | skóre: 23 | blog: cxblog | Lanškroun
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
To se hodí v PHP4 :)
Můj blog Pokud máte taky blog, můžeme vyměnit odkazy :)
freshmouse avatar 10.8.2007 13:37 freshmouse | skóre: 42 | blog: Bruno Banány
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Aha, takže ten nadpis "PHP-4 parsování xml" znamená, že se mluví o PHP 4. Já myslel, že je to myšleno jako "4. díl seriálu o PHP"... No nic.
10.8.2007 13:45 Creckx | skóre: 23 | blog: cxblog | Lanškroun
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Co?
Můj blog Pokud máte taky blog, můžeme vyměnit odkazy :)
10.8.2007 14:31 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Už jsem to opravil. Je to myšleno jako 4.díl
10.8.2007 15:02 Creckx | skóre: 23 | blog: cxblog | Lanškroun
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Člověk by čekal, že článek nebude vypadat jako dotaz :) Ale to je fuk..
Můj blog Pokud máte taky blog, můžeme vyměnit odkazy :)
10.8.2007 16:02 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Dávám to do blogu jednak proto, že je to do Poradny dlouhé a také proto, že v Poradně jsou dotazy ohledne PHP často zamykané, i když PHP je stejně součástí Linuxu, jako jiné programy.;-) A také, aby se někdo mohl z mých chyb poučit.
Jardík avatar 10.8.2007 23:44 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Od kdy je PHP součástí Linuxu? Já ho tu v "make menuconfig" nikde nevidím ...
Věřím v jednoho Boha.
10.8.2007 16:11 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
A kdybych chtěl, aby to fungovalo pod PHP4 i PHP5, tak co mám použít? Teď jsem to už přepsal s pomocí SimpleXML pro PHP5 a ještě potřebuji něco pro PHP4.
10.8.2007 18:07 Goffix | skóre: 25 | blog: Powered by ArchLinux | Hradec Králové
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
To bude podle mě docela problém. DOM je jedna z věcí co byla pro PHP5 kompletně předělána a třídy nejsou zpětně kompatibilní. V PHP4 bylo rozšíření DOM XML a v PHP5 jsou DOM a SimpleXML, které lze mezi sebou navzájem převádět.
Daniel Kvasnička ml. avatar 11.8.2007 11:06 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Teď jsem to už přepsal s pomocí SimpleXML pro PHP5 a ještě potřebuji něco pro PHP4.
A proc? To je dneska takovy problem sehnat hosting pro PHP5? Kdyz se budeme neustale ohlizet na PHP4, jen to bude oddalovat jeho definitivni smrt, ke ktere je urceno.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
10.8.2007 13:35 Creckx | skóre: 23 | blog: cxblog | Lanškroun
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Nechce, nezná, získává zkušenosti. Nedělá to špatně.
Můj blog Pokud máte taky blog, můžeme vyměnit odkazy :)
10.8.2007 12:13 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Odpovědět | Sbalit | Link | Blokovat | Admin
A co Document Object Model?
Pochybnost, nejistota - základ poznání
10.8.2007 12:16 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Ten jsem nezkoušel. Já jsem vycházel ze seriálu na Linuxsoftu :-( V tom díle píšou o parsování XML.
10.8.2007 14:06 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Tak ten DOM vyzkoušej. Dělám s tím dotnetu a je to hodně pohodlné.
Pochybnost, nejistota - základ poznání
10.8.2007 13:34 Creckx | skóre: 23 | blog: cxblog | Lanškroun
Rozbalit Rozbalit vše Re: PHP-4 parsování xml
Odpovědět | Sbalit | Link | Blokovat | Admin
Podle mě se ti tam tisknout i uzavírací tagy. Poslední dva, ale z nějakýho důvodu ne, to už je na tobě.
Můj blog Pokud máte taky blog, můžeme vyměnit odkazy :)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.