XML solution (was Re: el)

Dimitris Kamenopoulos el97146 at mail.ntua.gr
Fri Oct 5 18:55:38 EEST 2001


On Friday 05 October 2001 09:36, you wrote:
> On Tuesday 02 October 2001 16:44, Dimitris Kamenopoulos wrote:
> 
> Εχεμ, τελικά δεν το σχολίασε κανείς αυτό :)
> 
>
> > Εναλλακτικά έχω να προτείνω την εξής λύση:
> >
> > α) Ένα αρχείο XML της μορφής:
>
> 
> Καθόλου άσχημη λύση.
> 
>
> > β) Με το JDOM (www.jdom.org) είναι κυριολεκτικά δουλειά
> > ενός απογεύματος να γραφεί εφαρμογή  (και εφαρμογίδιο) Java που
> > να επιτρέπει την επισκόπηση του αρχείου, 
>
> 
> ένα το κρατούμενο (1)
> 
>
> > Μπορεί ακόμα
> > το αρχείο από την προγραμματιστικά βολικότατη XML να
> > μετατραπεί «εύκολα» σε .po (για το kbabeldict), .html (εκτυπώσιμη) ή
> > ό,τι άλλο γουστάρετε.
>
> 
> πώς το εννοείς αυτό το "εύκολα" ??? έχεις υπόψιν σου συγκεκριμένο 
> πρόγραμμα ???
> 
>
> > Είναι κάτι που θέλω να φτιάξω εδώ και αρκετές εβδομάδες
>
> 
> Εννοείς σε C ?? (πες ναι, πές ναι ;)

Όχι :-)
 
> Πάω στο κρατούμενο: to JDOM θα είναι μόνο για την κατασκευή της 
> εφαρμογής προεσκόπησης ?
Το JDOM είναι ένα βολικότατο OpenSource Java API (www.jdom.org) που διαβάζει 
αρχεία XML και σου δίνει δενδροειδή αντικείμενα τα οποία μπορείς να 
χειριστείς πολύ εύκολα.
Για παράδειγμα, αν έχουμε το αρχείο dict.xml: 

<dict>
<term id="term1">
<original>server</original>
<translation>εξυπηρετητής</translation>
<translation>διακομιστής</translation>
<comment>Κάποιο Σχόλιο</comment>
</term>
<term id="term2">
<original>cut</original>
<translation>αποκοπή</translation>
<comment>στο μενού edit</comment>
</term>

</dict>
 
Να πώς παίρνεις ένα δέντρο JDOM:
...
org.jdom.Document document;
SAXBuilder builder = new SAXBuilder(); //χρησιμοποιούμε αυτόματα τους 
//ταχύτατους SAX parsers
document =builder.build("dict.xml");

Να πώς παίρνεις από αυτό το δένδρο κάποια elements:

Element dict = document.getRootElement(); -> επιστρέφεί αναφορά στο <dict> 
element και όλα τα περιεχόμενά του
List terms = dict.getChildren("term"); -> επιστρέφει μια λίστα με τα δύο 
<term> elements που βρίσκονται μέσα στο dict.

Και τώρα θα πάρω ένα <term> element από τη λίστα
και θα το επεξεργαστώ:
Iterator i = terms.iterator();
Element term = (Element)i.next();

Element original = term.getChild("original");
System.out.println(original.getText()); // θα τυπώσει "server"
System.out.println(term.getAttribute("id")); //θα τυπώσει "term1"

Ενώ, αν για παράδειγμα δώσεις 
original.setText("bla");
original.setAttribute("id", "jj");
το XML αρχείο αποκτά τη μορφή (αφού φυσικά κάνεις 
ένα flushing):

<dict>
<term id="jj">
<original>bla</original>
<translation>εξυπηρετητής</translation>
<translation>διακομιστής</translation>
<comment>Κάποιο Σχόλιο</comment>
</term>
...

και πάει λέγοντας (έμεινα στη λιγότερο extreme Java σύνταξη, για να παραμείνω 
κατανοητός). Μια πλήρης ανάλυση του JDOM ξεφεύγει πολύ 
από τη συζήτηση, πάντως κάνει το χειρισμό της XML παιχνιδάκι.  Νομίζω 
ότι καταλαβαίνεις πώς εννοώ το "εύκολα": από τη στιγμή που έχει απαλλαγεί 
εντελώς από το πρόβλημα του parsing (που με οποιονδήποτε άλλον τρόπο 
απαιτεί εκατοντάδες γραμμές) και έχεις στη διάθεσή σου μια προγραμματιστικά 
απλή και βολική δομή, μπορείς να την κάνεις κυριολεκτικά ό,τι θέλεις. 
Επιπλέον το JDOM υποστηρίζει και XSLT, δηλαδή αυτόματη μετατροπή 
XML σε HTML ή plain text (βέβαια πρέπει να ορίσεις τους κανόνες μορφοποίησης,
αλλά και αυτό γίνεται με XML και σίγουρα χωρίς ούτε μια γραμμή κώδικα). 

>
> > (αλλά έφαγα πολλές ήτες: δουλειά, εξεταστική, οριστική
> > απώλεια σκληρού δίσκου) και θα ήθελα γνώμες.
>
> 
> Είναι πολύ καλή ιδέα, και ανάλογα με το πώς υλοποιείται, θα μπορούσα να 
> σε βοηθήσω πάνω σε αυτό ;-)

Για την ακρίβεια το applet είναι έτοιμο (πιο πολλή ώρα μου πήρε να συνηθίσω 
το designer του JBuilder παρά να γράψω τον κώδικα χειρισμού της XML)! Το είχα 
ετοιμάσει από προχθές αλλά δε μου δούλευε, ενώ ο κώδικας ήταν σωστός. Τελικά 
ανακάλυψα ότι η xml δεν ήταν συντακτικά εντάξει (είχα βάλει δύο  διαδοχικά 
</term> tags) πράγμα που δε συγχωρείται :-).
Ένα σχεδιαστικό μειονέκτημα είναι ότι κάνει γραμμική αναζήτηση στους όρους,
πράγμα που θα αποτελέσει σίγουρα πρόβλημα απόδοσης αν οι όροι ξεπεράσουν τους 
200-300. Από την άλλη, ας ξεπεράσουν οι όροι τους 200 και σας βάζω εγώ 
hashmaps να τους βρίσκουν σε σταθερό χρόνο ;-)
Θα το ανεβάσω σήμερα ή μάλλον αύριο (σήμερα πνίγομαι) σε κάποια 
ιστοσελίδα και θα ειδοποιήσω τη λίστα.


> > Το βασικό πρόβλημα είναι φυσικά ότι θα πρέπει το αρχείο να
> > εμπλουτιστεί με όρους, αλλιώς θα έχει την τύχη του Lexis...
>
> 
> όσο για το Lexis, υπάρχει κάποιος που έστειλε e-mail στο ΔΣ και λέει 
> πως θέλει να συνεχίσει να το δουλεύει.
> 
> Tο βασικό πρόβλημα του LEXIS αυτήν την στιγμή (ανεξάρτητα από το 
> λεξικό), είναι να ανεξαρτητοποιηθεί από το LUGistics (να είναι σε δικό 
> του "site").
> 
> πάντως, αν προχωρήσουμε σε μια "Generic" λύση του στύλ XML, υποθέτω ότι 
> αυτό το λεξικό θα μπορούσε με την ίδια "ευκολία" που ανέφερες να 
> προστεθεί και στο LEXIS.

Χμμ, ναι. Σε κάθε περίπτωση, η XML είναι βολική λύση αφού είναι 
το ίδιο κατανοητή από ανθρώπους και προγράμματα. Εξάλλου 
αν κάποιος δε γουστάρει τη Java, υπάρχουν ένα σωρό λύσεις 
για άλλες γλώσσες (π.χ. libxml, QSAX).
 




More information about the I18ngr mailing list