Zoals te lezen is in dit [rml][ java/xml]pattern voor afhandelen XML[/rml] topic, ben ik ben bezig met het maken van een generieke xml reader.Even in het kort: Ik laat tags afhandelen doormiddel van reflection, dus voor elke tag is er een corresponderende klasse.
Beschouw het volgende stukje xml:
Zoals je ziet worden in dit bestand verschillende servers beschreven. Nu wil ik dat bijvoorbeeld de tag "<server>" zijn informatie naar een bepaalde klasse schrijft (die dan per direct afgehandeld word en verwijderd wordt), de volgende keer dat een "server" tag gevonden wordt dient uiteraard weer hetzelfde te gebeuren. Dit alles moet generiek zijn dus elke mogelijk situatie aankunnen.
Ik zat zelf te denken aan het volgende:
Oftewel elke functie returned de megeleverde properties en voegt er eventueel iets aan toe. Bij de tag-invoker zorg ik er dan voor dat diezelfde properties steeds met elke teg handler worden meegeleverd. Een sluit element van bijvoorbeeld "server" zou dan de properties kunnen verwerken, en een null returnen. Het start element zou dan een nieuwe properties kunnen aanmaken.
De interface ResultHandler zou dan een methode processProperties o.i.d. moeten hebben zodat een volledig gevulde properties instantie afgehandeld kan worden.
Toch vind ik het een beetje omslachtig, dus ik vroeg me af of er betere manieren zijn (ongetwijfeld).
ps.
Ik wil niet met een of andere DOM implementatie werken, dit vanwege resources...
Beschouw het volgende stukje xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <dbms-servers>
<server name="MYSQL">
<driver>org.gjt.mm.mysql.Driver</driver>
<data-types>
<data-type type="TEXT">TEXT</data-type>
<data-type type="VARCHAR">VARCHAR</data-type>
<data-type type="INTEGER">INTEGER</data-type>
</data-types>
</server>
<server name="MSSQL">
<driver>org.ms.whatever.Driver</driver>
<data-types>
<data-type type="TEXT">TEXT</data-type>
<data-type type="VARCHAR">VARCHAR</data-type>
<data-type type="INTEGER">INTEGER</data-type>
</data-types>
</server>
</dbms-servers> |
Zoals je ziet worden in dit bestand verschillende servers beschreven. Nu wil ik dat bijvoorbeeld de tag "<server>" zijn informatie naar een bepaalde klasse schrijft (die dan per direct afgehandeld word en verwijderd wordt), de volgende keer dat een "server" tag gevonden wordt dient uiteraard weer hetzelfde te gebeuren. Dit alles moet generiek zijn dus elke mogelijk situatie aankunnen.
Ik zat zelf te denken aan het volgende:
code:
1
2
3
4
5
6
7
| //een functie uit de tag handler interface
public Properties startElement(ResultHandler handler,
Properties properties
String uri,
String localName,
String qName,
Attributes attributes); |
Oftewel elke functie returned de megeleverde properties en voegt er eventueel iets aan toe. Bij de tag-invoker zorg ik er dan voor dat diezelfde properties steeds met elke teg handler worden meegeleverd. Een sluit element van bijvoorbeeld "server" zou dan de properties kunnen verwerken, en een null returnen. Het start element zou dan een nieuwe properties kunnen aanmaken.
De interface ResultHandler zou dan een methode processProperties o.i.d. moeten hebben zodat een volledig gevulde properties instantie afgehandeld kan worden.
Toch vind ik het een beetje omslachtig, dus ik vroeg me af of er betere manieren zijn (ongetwijfeld).
ps.
Ik wil niet met een of andere DOM implementatie werken, dit vanwege resources...