Ja osobne jsem nebyl moc spokojeny ani s domxml (PHP verze 4.2.1) Bylo tam dost bugu a chovani nekterych funkci se menilo z verze na verzi, komplikovana prace s namespaces (bylo nutne je VSECHNY zaregistrovat, nez slo s elementy pracovat)
I tak trivialni operace jako zmena dat v elementu vyzadovala volat 3 (!) prikazy a musel jsem si na to udelat vlastni funkci:
function my_set_value($doc,$element,$value) {
$content = $element->first_child();
$content->replace_node($doc->create_text_node($value));
}
..a navic, ve starsich verzich to fungovalo jinak!
Problem byl v metode set_content(), ta ve starsich verzich menila cely obsah tagu (replace), v novejsich PRIDAVALA (append) data ke starsim, bylo proto nutne nejdrive starsi zrusit.
..inu experimentalni rozhrani. Autori dobre vedeli proc pred nim v dokumentaci varovali :-)
Pak jsem objevil knihovnu XPath. Nenechte se zmat nazvem, poskytuje jednoduche a univerzalni rozhrani k praci s XML dokumentem (zjisteni dat, zemna dat, zmena struktury, vyhledavani, export do souboru s hezkou upravou atd.)
Vyhody:
- extremne jednoducha
- cela napsanan v PHP! zadna zavislost na nejake
nativni knihovne nebo externim parseru.
Zvlaste vhodna pro free servery s PHP kde
neni zadny parser.
- rychla!
- stabilni projekt
- na zadny bugy jsem nenarazil
- neni zavisla na verzi PHP
- stabilni API (lehce objektove)
Vrele vsem doporucuji!
http://sourceforge.net/projects/phpxpath/
Tady je kratka ukazka prace:
<?
require_once("XPath.class.php");
$doc= new XPath();
$doc->importFromFile("pokus.xml");
// zjisti kolik ma tabulka bunek <ccc> pred zmenami
$pole_bunek = $doc->evaluate("//ccc");
echo "pocet: ".count($pole_bunek)."\n"; // ==> 1
// absolutni cesta k bunce
// je to spis jako index k asoc. poli nez XPath :-)
echo "Vypis: ".$doc->getData("/root[1]/aaa[1]/bbb[1]/ccc[1]")."\n"; // ==> "nejaka hodnota..."
$doc->replaceData("/root[1]/aaa[1]/bbb[1]/ccc[1]","novy obsah");
// zmeny ve strukture
// pomoci kusu kodu XML ve forme stringu, nebo lze i pomkoci pole se specialnim formatem
$doc->appendChild("/root[1]/aaa[1]/bbb[1]","<ccc>pridano</ccc>"); // ..automaticky se zkonvertuje do elementu!
$doc->appendChild("/root[1]/aaa[1]/bbb[1]","<ccc>taky pridano<ddd>1</ddd></ccc>");
$doc->appendChild("/root[1]/aaa[1]/bbb[1]","<ccc>..do tretice pridano<ddd>2</ddd></ccc>");
// zjisti kolik ma tabulka elementu <ccc> po pridani
$pole_bunek2 = $doc->evaluate("//ccc");
echo "pocet <ccc> po pridani: ".count($pole_bunek2)."\n"; // ==> 4
// zjisti kolik ma tabulka elementu <ddd> po pridani
$pole_bunek3 = $doc->evaluate("//ddd");
echo "pocet <ddd> po pridani: ".count($pole_bunek3)."\n"; // ==> 2
$doc->exportToFile("pokus2.xml");
?>