[ jeremycod @ 17.07.2004. 21:09 ] @
Potreban mi je savet za resavanje SAX API problema.
xml dokument ovako izgleda uprosceno:

Code:
<LOM>
<concept>
<id>1</id>
<Unit><id>11</id><title>Introduction</title></Unit>
...
<Unit><id>19</id><title>Summary</title></Unit>

</concept>
<concept>
<id>2</id>
<Unit><id>21</id><title>Introduction</title></Unit>
...
<Unit><id>29</id><title>Summary</title></Unit>
</concept>
...
...
<concept>
<id>23</id>
<Unit><id>231</id><title>Introduction</title></Unit>
...
<Unit><id>239</id><title>Summary</title></Unit>
</concept>
</LOM>


Najpre je potrebno koriscenjem SAX API parsirati dokument sto sam uradio bez problema,ali kasnije u programu potrebno je povremeno pozivati parser da bi pronasao odredjeni koncept koji ima odgovarajuci "id" i ucitati sve podatke koji pripadaju tom konceptu, tj. unit-e.

Da li neko moze da mi predlozi neko elegantno resenje kako da resim ovaj problem?

[ -zombie- @ 19.07.2004. 07:12 ] @
1) nije lepo X-postovati pitanja na više foruma istovremeno..

2) najelegantnije rešenje je (najverovatnije) uz pomoć xpath-a (javax.xml.xpath), a upit koji vraća željene Unite bi izgledao otprilike ovako:

Code:
/LOM/concept[id="23"]/Unit


3) sledeće po "elegantnosti" rešenje bi verovatno bilo uz pomoć DOMa (ali ne dovoljno elegantno da pišem i primer za njega ;).

4) pošto si isto pitanje postavio i na java forumu, pretpostavljam da si koristio org.xml.sax.ContentHandler interfejs, tako da si već obradio start/endElement() i characters() događaje.

sada samo treba još da dodaš par promenjivih i malo logike da bi mogao da pratiš/pamtiš trenutno "stanje" u kome se nalaziš dok parsiraš dokument..

npr, osnovna stavka bi bilo kreiranje stack-a (java.util.stack) sa otvorenim elementima, tako što bi pri svakom start/endElement() dodavao/izbacivao element iz stack-a.

drugi korak bi bio pamćenje vrednosti ID texta kada se nalaziš u /LOM/concept/id elementu.

treći korak bi bio odradio kada se nalaziš u nekom /LOM/concept/Unit elementu, i detektovao da je (prethodno zapamćeni) ID jednak baš onom traženom. tada ti još ostaje samo da učitaš/zapamtiš podatke iz tog Unit elementa, i gotov si..
[ jeremycod @ 19.07.2004. 12:53 ] @
Hvala na pomoci.
Uspeo sam da resim problem, otprilike tako kao sto si opisao sa koriscenjem org.xml.sax.ContentHandler interfejsa, stim sto sam ja prvi put pokusao da napravim jedan parser koji obradjuje ceo dokument ili samo deo kada je to potrebno. To je mnogo iskomplikovalo stvar pa su start/endElement bili jako komplikovani i nepregledni. Sada sam to razdvojio u dve klase koje posebno obradjuju po jedan od ova dva slucaja i to sada sasvim korektno radi.