Πώς να διαβάζετε και να γράφετε αρχεία XML με κώδικα

Πώς να διαβάζετε και να γράφετε αρχεία XML με κώδικα

Θα θέλατε να μάθετε πώς να διαβάζετε και να γράφετε ένα αρχείο XML από τη Java;





XML files χρησιμοποιούνται για διάφορους σκοπούς, συμπεριλαμβανομένης της αποθήκευσης δεδομένων. Πριν γίνει δημοφιλές το JSON, η XML ήταν η προτιμώμενη μορφή για την αναπαράσταση, αποθήκευση και μεταφορά δομημένων δεδομένων. Παρόλο που η δημοτικότητα της XML έχει μειωθεί τα τελευταία χρόνια, μπορεί να την συναντάτε περιστασιακά, επομένως είναι σημαντικό να μάθετε πώς να εργάζεστε με αυτήν από τον κώδικα.





Η Java Standard Edition (SE) περιλαμβάνει το Java API για επεξεργασία XML (JAXP) , ο οποίος είναι ένας όρος -ομπρέλα που καλύπτει τις περισσότερες πτυχές της επεξεργασίας XML. Αυτά περιλαμβάνουν:





  • ΚΡΙΣΗ: Το Document Object Model περιλαμβάνει κλάσεις για εργασία με τεχνουργήματα XML όπως στοιχείο, κόμβο, χαρακτηριστικά κ.λπ. Το API DOM φορτώνει ολόκληρο το έγγραφο XML στη μνήμη για επεξεργασία, επομένως δεν είναι πολύ κατάλληλο για εργασία με μεγάλα αρχεία XML.
  • SAX: Το Απλό API για XML είναι ένας αλγόριθμος που βασίζεται σε γεγονότα για την ανάγνωση XML. Εδώ η XML υποβάλλεται σε επεξεργασία με ενεργοποίηση συμβάντων που εντοπίζονται κατά την ανάγνωση XML. Οι απαιτήσεις μνήμης για τη χρήση αυτής της μεθόδου είναι χαμηλές, αλλά η εργασία με το API είναι πιο πολύπλοκη από την εργασία με το DOM.
  • StAX: Το API ροής για XML είναι μια πρόσφατη προσθήκη στα API XML και παρέχει φιλτράρισμα, επεξεργασία και τροποποίηση ροής XML υψηλής απόδοσης. Παρόλο που αποφεύγει τη φόρτωση ολόκληρου του εγγράφου XML στη μνήμη, παρέχει αρχιτεκτονική τύπου έλξης και όχι αρχιτεκτονική βάσει γεγονότων, οπότε η εφαρμογή είναι πιο εύκολο να κωδικοποιηθεί και να κατανοηθεί από τη χρήση του SAX API.

Σε αυτό το άρθρο, χρησιμοποιούμε το API DOM για να δείξετε πώς να διαβάζετε και να γράφετε αρχεία XML από τη Java. Θα καλύψουμε τα άλλα δύο API σε μελλοντικά άρθρα.

Ένα δείγμα αρχείου XML

Για τους σκοπούς αυτού του άρθρου, παρουσιάζουμε τις έννοιες χρησιμοποιώντας το ακόλουθο δείγμα XML, το οποίο μπορεί να βρεθεί εδώ :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Ανάγνωση αρχείου XML

Ας δούμε τα βασικά βήματα που απαιτούνται για την ανάγνωση ενός αρχείου XML χρησιμοποιώντας το DOM API.

Το πρώτο βήμα είναι να λάβετε ένα παράδειγμα DocumentBuilder Το Το εργαλείο δημιουργίας χρησιμοποιείται για την ανάλυση εγγράφων XML. Για βασική χρήση, το κάνουμε ως εξής:





πώς να αποκτήσετε πρόσβαση στον παλιό σκληρό δίσκο
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Μπορούμε τώρα να φορτώσουμε ολόκληρο το έγγραφο στη μνήμη ξεκινώντας από το ριζικό στοιχείο XML. Στο παράδειγμά μας, είναι το κατάλογος στοιχείο.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Και αυτό είναι, παιδιά! Το API DOM για ανάγνωση XML είναι πραγματικά απλό. Έχετε πλέον πρόσβαση σε ολόκληρο το έγγραφο XML ξεκινώντας από το βασικό του στοιχείο, κατάλογος Το Ας δούμε τώρα πώς να το δουλέψουμε.





Χρήση του DOM API

Τώρα που έχουμε τη ρίζα XML Στοιχείο , μπορούμε να χρησιμοποιήσουμε το DOM API για να εξαγάγουμε ενδιαφέροντα ψήγματα πληροφοριών.

Πάρτε όλα τα Βιβλίο παιδιά του ριζικού στοιχείου και βρόχο πάνω τους. Σημειώστε ότι getChildNodes () επιστρέφει όλα παιδιά, συμπεριλαμβανομένου κειμένου, σχολίων κ.λπ. Για το σκοπό μας, χρειαζόμαστε μόνο τα στοιχεία του παιδιού, οπότε παραλείπουμε τα άλλα.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

Πώς βρίσκετε ένα συγκεκριμένο παιδικό στοιχείο, δεδομένου του γονέα; Η ακόλουθη στατική μέθοδος επιστρέφει το πρώτο στοιχείο αντιστοίχισης αν βρεθεί ή μηδενικό. Όπως μπορείτε να δείτε, η διαδικασία περιλαμβάνει τη λήψη της λίστας των θυγατρικών κόμβων και την περιήγησή τους μέσω επιλογής κόμβων στοιχείων με το καθορισμένο όνομα.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

Σημειώστε ότι το API DOM αντιμετωπίζει το περιεχόμενο κειμένου μέσα σε ένα στοιχείο ως ξεχωριστό κόμβο τύπου TEXT_NODE Το Επιπλέον, το περιεχόμενο κειμένου μπορεί να χωριστεί σε πολλούς παρακείμενους κόμβους κειμένου. Επομένως, απαιτείται η ακόλουθη ειδική επεξεργασία για την ανάκτηση του περιεχομένου κειμένου σε ένα στοιχείο.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Οπλισμένοι με αυτές τις λειτουργίες ευκολίας, ας δούμε τώρα κάποιον κώδικα για να παραθέσουμε κάποιες πληροφορίες από το δείγμα XML. Θα θέλαμε να δείξουμε λεπτομερείς πληροφορίες για κάθε βιβλίο, όπως θα ήταν διαθέσιμες σε έναν κατάλογο βιβλίων.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Σύνταξη εξόδου XML

Η Java παρέχει το API XML Tranform για μετατροπή δεδομένων XML. Χρησιμοποιούμε αυτό το API με το μετατροπή της ταυτότητας να παράγει έξοδο.

Για παράδειγμα, ας προσθέσουμε ένα νέο Βιβλίο στοιχείο του καταλόγου δειγμάτων που παρουσιάστηκε παραπάνω. Οι λεπτομέρειες του βιβλίου (όπως π συγγραφέας , τίτλος , κλπ) μπορεί να ληφθεί εξωτερικά, ίσως από ένα αρχείο ιδιοτήτων ή μια βάση δεδομένων. Χρησιμοποιούμε το ακόλουθο αρχείο ιδιοτήτων για τη φόρτωση των δεδομένων.

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

Το πρώτο βήμα είναι να αναλύσετε το υπάρχον αρχείο XML χρησιμοποιώντας τη μέθοδο που παρουσιάστηκε παραπάνω. Ο κώδικας εμφανίζεται επίσης παρακάτω.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Φορτώνουμε τα δεδομένα από το αρχείο ιδιοτήτων χρησιμοποιώντας το Ιδιότητες τάξη με java. Ο κώδικας είναι αρκετά απλός και φαίνεται παρακάτω.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

Μόλις φορτωθούν οι ιδιότητες, ανακτήσαμε τις τιμές που θέλουμε να προσθέσουμε από το αρχείο ιδιοτήτων.

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Ας δημιουργήσουμε τώρα ένα κενό Βιβλίο στοιχείο.

καλύτερη μορφή για εξωτερικό σκληρό δίσκο mac
Element book = document.createElement('book');
book.setAttribute('id', id);

Προσθέτοντας τα στοιχεία του παιδιού στο Βιβλίο είναι τετριμμένο. Για λόγους ευκολίας, συλλέγουμε τα απαιτούμενα ονόματα στοιχείων στο a Λίστα και προσθέστε τις τιμές σε έναν βρόχο.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

Και έτσι γίνεται. ο κατάλογος το στοιχείο έχει τώρα το νέο Βιβλίο προστέθηκε στοιχείο. Το μόνο που απομένει τώρα είναι να γράψετε την ενημερωμένη XML.

Για τη σύνταξη της XML, χρειαζόμαστε ένα παράδειγμα Μετασχηματιστής που δημιουργείται όπως φαίνεται παρακάτω. Σημειώστε ότι ζητάμε εσοχή της εξόδου XML χρησιμοποιώντας το setOutputProperty () μέθοδος.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

Το τελευταίο βήμα για τη δημιουργία της εξόδου XML είναι η εφαρμογή της μεταμόρφωσης. Το αποτέλεσμα εμφανίζεται στη ροή εξόδου, System.out Το

tform.transform(new DOMSource(document), new StreamResult(System.out));

Για να γράψετε την έξοδο απευθείας σε ένα αρχείο, χρησιμοποιήστε τα παρακάτω.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

Και αυτό ολοκληρώνει αυτό το άρθρο σχετικά με την ανάγνωση και τη σύνταξη αρχείων XML χρησιμοποιώντας το DOM API.

Έχετε χρησιμοποιήσει το API DOM στις εφαρμογές σας; Πώς απέδωσε; Ενημερώστε μας στα παρακάτω σχόλια.

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Canon εναντίον Nikon: Ποια μάρκα κάμερας είναι καλύτερη;

Η Canon και η Nikon είναι τα δύο μεγαλύτερα ονόματα στη βιομηχανία κάμερας. Ποια μάρκα προσφέρει όμως την καλύτερη γκάμα φωτογραφικών μηχανών και φακών;

Διαβάστε Επόμενο
Σχετικά θέματα
  • Προγραμματισμός
  • Ιάβα
Σχετικά με τον Συγγραφέα Jay Sridhar(Δημοσιεύθηκαν 17 άρθρα) Περισσότερα από τον Jay Sridhar

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή