Page 1 of 1

Αποθήκευση αλλαγών xml αρχείου

Posted: Sun Oct 26, 2008 10:59 am
by rapadder
Έχω ένα αρχείο xml του οποίου τα πεδία επεξεργάζομαι μέσα από μια φόρμα. Αυτό που θέλω είναι:

1. Όταν αλλάξω μια τιμή ενός πεδίου του xml αρχείου (μέσα από την φόρμα), αυτή να αποθηκευτεί στην δομή (αντικείμενο της Java) που αντιστοιχεί στο xml αρχείο που επεξεργάζομαι.

Document doc = db.parse(xmlfile);

Διάβασα ότι:

Java XML support classes don't do save in common meaning of word. Java Classes support methods to transform Document from one state to other state. One state can be Document instance in memory, the second state after transformation XML file.

Αυτό σημαίνει ότι θα πρέπει να αποθηκεύω κάπου αντικείμενα Document, δηλαδή τις διάφορες καταστάσεις του doc. Επίσης θα πρέπει να χρησιμοποιώ μεθόδους/ κλάσεις που να επιδρούν πάνω στο doc (π.χ. org.w3c.dom.Node). Διορθώστε με αν κάνω λάθος.

Παρατήρηση:

Η κλάση TransformerFactory απ' ότι κατάλαβα χρησιμοποιείται κυρίως για να μετατρέψεις ένα αρχείο xml σε μια άλλη μορφή (text/ xml/ html) και όχι για την αυτή καθ' αυτή επεξεργασία του DOM tree:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();

DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(fos);
// transform source into result will do save
try {
transformer.transform(source, result);
}
catch (TransformerException e) {
System.out.println("Error transform: " + e.getMessage());
}

Re: Αποθήκευση αλλαγών xml αρχείου

Posted: Sun Oct 26, 2008 9:26 pm
by tsilochr
κάνεις τη ζωή σου δύσκολη σταμάτη.

1. επιλέγεις πως θα διαβάζεις/γράφεις στο xml document - SAX ή κάποιο άλλο framework (εγώ χρησιμοποιούσα JAXB)
2. σχεδιάζεις το αντικείμενο που αναπαριστά αυτό που βάζεις στο xml, τυπικά εδώ θα φτιάξεις ένα απλό java bean
3. αποφασίζεις το pattern που θα χρησιμοποιήσεις για να σώζεις κάθε αλλάγη στο java bean του βήματος 2 - κάθε κλήση σε setter θα σώζει το περιεχόμενο του java bean στο xml από όπου προήλθε ή κάνεις τις αλλαγές σου και στο τέλος έχεις μια συνάρτηση που καλείς (πχ save() )για να γράψεις στο xml doc.
4. στη φόρμα σου δεν θα χρησιμοποιείς το xml doc αλλά το java object το οποίο θα πειράζεις και μετά θα το κάνεις save.

Κανονικά θα πρέπει να έχεις αρκετά γενικό το κώδικα σου ώστε αν αλλάξει η απαίτηση και από xml σώζεις σε άλλου τύπου storage, να κάνεις ελάχιστες αλλαγές.

Re: Αποθήκευση αλλαγών xml αρχείου

Posted: Mon Oct 27, 2008 12:34 am
by rapadder
Γενικά έχω προσπαθήσει να ακολουθήσω αυτά τα βήματα. Απλά στην περίπτωση μου το xml αρχείο δεν περιέχει την περιγραφή ενός αντικειμένου της Java (με τις παραμέτρους του). Το δικό μου xml αρχείο έχει τον ρόλο του αρχείου εισόδου, δηλαδή περιέχει τις τιμές διαφόρων παραμέτρων. Αυτές οι παράμετροι μπορεί να είναι αντικείμενα της Java αλλά είναι κυρίως μεταβλητές με τις τιμές τους.
Αυτό που κάνω τελικά είναι να διαβάζω το xml αρχείο, να δημιουργώ ένα Document αντικείμενο το οποίο και πειράζω για να το κάνω save μετά, όπως γράφεις. Η επεξεργασία του DOM tree γίνεται μέσα από ένα java object που έχω ορίσει κατάλληλα. Τέλος χρησιμοποιώντας την κλάση TransformerFactory μπορώ να σώσω το DOM tree από xml σε άλλου τύπου storage, περνώντας την αντίστοιχη παράμετρο στην συνάρτηση transform(source, result). Οπότε νομίζω ότι βρήκα λύση στα παραπάνω.

Re: Αποθήκευση αλλαγών xml αρχείου

Posted: Mon Oct 27, 2008 11:46 am
by tsilochr
rapadder wrote:Γενικά έχω προσπαθήσει να ακολουθήσω αυτά τα βήματα. Απλά στην περίπτωση μου το xml αρχείο δεν περιέχει την περιγραφή ενός αντικειμένου της Java (με τις παραμέτρους του). Το δικό μου xml αρχείο έχει τον ρόλο του αρχείου εισόδου, δηλαδή περιέχει τις τιμές διαφόρων παραμέτρων. Αυτές οι παράμετροι μπορεί να είναι αντικείμενα της Java αλλά είναι κυρίως μεταβλητές με τις τιμές τους.
Το java object δεν είναι ανάγκη να αναπαριστά κάποια οντότητα, μπορεί να είναι ένα Propertiesή Map

Re: Αποθήκευση αλλαγών xml αρχείου

Posted: Mon Oct 27, 2008 12:04 pm
by rapadder
Ευχαριστώ. Θα το κοιτάξω.