Pársování XML a zobrazení v DataGridu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lumen
Člen | 32
+
0
-

Ahoj,
potřeboval bych poradit jak řešit daný problém:

Mám DB tabulku se dvěma sloupci. První sloupec obsahuje ID a druhý je typu mediumtext a obsahuje XML. Chtěl bych takovou tabulku zobrazovat pomocí DataGridu tak, aby se v jednotlivých sloupcích zobrazovaly rozpársované elementy. Jak to provest?

Je jasné, že nemůžu celou tabulku „vyselectovat“, rozpársovat někam do pole a to pole zobrazit datagridem = tabulka má několik tisíc záznamů. Napadá mě rozpársovávat jen ty záznamy, které se mají uživateli zobrazit, ale netuším jak bych to prováděl – v jaké metodě, jak zjistím které záznamy se budou vykreslovat…

Ještě poddotaz – má Nette něco na práci s XML?

Díky za cokoli…

Petr Motejlek
Člen | 293
+
0
-

Jestli tomu dobře rozumím, ty máš dva sloupce, v jednom máš ID záznamu a ve druhém máš xml ve tvaru <sloupec>hodnota</sloupec><druhySloupec>hodnota2</druhySloupec><tretiSloupec>hodnota3</tretiSloupec>? Moje otázka je, jestli je počet elementů v tom sloupci s XML daty vždycky stejný, tzn, jestli dopředu víš, kolik sloupců by měla mít tabulka, nebo jestli se ti to mění, a ty to jindy, než po projití všech záznamů, nezjistíš.

Pokud počet sloupců znáš dopředu, přemýšlel bych o nějakém regexpu, který by se použil přímo v SQL, aby ti z databáze lezly ty sloupce jako vyextrahovaná data z patřičných elementů. Potom by s tím neměl mít datagrid problém. Určitě ale bude problém v editaci.

Pokud počet sloupců neznáš dopředu, tak si radši kup kulku a půjč pistoli ;). To AFAIK neuděláš jinak, než tak, že všechny záznamy projdeš. Maximálně bys to mohl mít lehčí, kdyby jsi stránkoval, a vypisoval to třeba po 50 záznamech, ty projdeš (snad) ještě celkem rychle.

P. S.: Já jsem se na Datagrid zatím jen díval, ještě jsem ho plně nikde nepoužil, takže to, co tady o něm píšu jsou možná jen bláboly, ale napadla mě jedna věc: možná by (v souvislosti s tímto) nebylo špatné, kdyby se u Datagridu řešilo něco jako interface DataAdapter, který by měl za úkol vracet pole s hodnotami pro daný řádek, a zároveň by uměl ty hodnoty zase někam zapsat. Když potom mám takovýhle hybrid databáze a XML dat, tak bych v tom čtení dělal select, parsoval to XML, vrátil pole, a při zápisu bych z toho pole zase udělal XML a to uložil do databáze.

Editoval Petr Motejlek (19. 1. 2010 12:29)

lumen
Člen | 32
+
0
-

Ty XML v databázové tabulce jsou v každém rádku stejné – mění se jen hodnota v elementech. V každém XML je vždy 10 elementů a mě zajímají jen 2. Tyto dva elementy bych chtěl vypisovat ve dvou sloupcích datagridu.
Jde mi pouze a jen o zobrazení záznamů – není potřeba editace.

Objevil jsem teď, že se v datagridu se dá nastavit anonymní callback funce pro úpravu dat ve sloupci:
jako například:

<?php
$grid['xml_sloupec']->formatCallback[] = function ($value) {
    return parsujAvratElement($value);
}
?>

je možné, že by to tím šlo udělat…

Petr Motejlek
Člen | 293
+
0
-

Ta editace by tak asi řešit šla. Pokud to chceš mít rychlé, šel bych cestou nějakého promakaného regexpu a výběr těch elementů jako sloupců přímo z databáze. Můžeš taky parsovat každý sloupec jako XML a hodnoty těch elementů přečíst přes PHP, ale to bude IMHO dost pomalé…

lumen
Člen | 32
+
0
-

Jo.. to je asi pravda.. Když mě z toho XML zajímají jen 2 údaje, tak to XML nemá smysl pársovat celé, ale jen si vytáhnout regexpem co potřebuju bude rychlejší…

odin
Člen | 50
+
0
-

Podle toho jaky pouzivas DBserver tak se zkus jeste podivat na to, jake ma funkce pro praci s XML, bylo by to asi lepsi nez ty regexpy.