08.09.2014 09:14
1
Ahoj, mám XML soubor (cca 20 mb) s tagy <AUTOR> a <KATEGORIE> a podle těchto elementů potřebuji najít všechny výsledky v XML a z těchto výsledků vytvořit nové XML.

Například chci najít všechny elementy splňující tyto podmínky (alespoň jednu):
<AUTOR> = "Foglar" a zároveň <KATEGORIE> = "Dobrodružné"
<AUTOR> = *jakýkoliv* a zároveň <KATEGORIE> = "Román"
<AUTOR> = "Hunter" a zároveň <KATEGORIE> = *jakákoliv"

Řešení co mě napadají:

1. Šoupnout si XML do databáze, vyhledat data a složit XML. Přijde mi to celkem zbytečné a náročné (XML obsahuje celkem dost dat, je třeba data aktualizovat atd. atd.).

2. Vyhledat si přes Xpath jednotlivé výsledky a složit je. Přiznám se, že netuším náročnost, ale mám pocit, že to nebude nic moc.

3. Procházet XML po jednotlivých elementech (třeba přes SAX), zkontrolovat podmínky, a pokud je splňují tak rovnou zkopírovat element do nového souboru. Výhoda je, že si můžu ukládat pozici a v případě nějaké havárie není problém pokračovat ve scriptu kde jsem skončil.

--

Takže osobně používám 3, ale třeba je ještě nějaké elegantnější řešení, které mě nenapadlo?
08.09.2014 09:50
2
V Php například jedním průchodem vytvořit slovník, array('kategorie' => array('autor 1' => 'kategorie' 'autor_2' => 'kategorie')); pak všichni autoři z kategorie_1, kategorie_2, takto array_merge(array_keys($dictionary['kategorie_1']), array_keys(dictionary['kategorie_2'])); nebo kategorie k autorovi array_filter($dictionary, function($x) { if (isset($x['autor'])) return $x['autor']; }); Pro větší efektivitu je možno názvy zakódovat do dalšího slovníku a v hlavním slovníku pracovat jen s přiděleným id.
08.09.2014 11:07
3
Myslím si, že nejvhodnější je využít XSL transformaci pomocí některého z dostupných XSLT procesorů. Samotný princip transformace je právě v převodu XML souboru do dalších souborů s odlišnou strukturou, v tomto případě opět XML.
08.09.2014 11:58
4
Původně odeslal petrnson
Myslím si, že nejvhodnější je využít XSL transformaci pomocí některého z dostupných XSLT procesorů. Samotný princip transformace je právě v převodu XML souboru do dalších souborů s odlišnou strukturou, v tomto případě opět XML.
No dal by se použít i SimpleXML, rychle se soubor načte do paměti a umí i Xpath a generovat XML.