En fait, Java prend en charge 4 méthodes pour analyser le XML hors de la boîte:
DOM Parser / Builder: La structure XML entière est chargée en mémoire et vous pouvez utiliser les méthodes DOM bien connues pour travailler avec elle. DOM vous permet également d'écrire dans le document avec des transformations Xslt. Exemple:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAX Parser: uniquement pour lire un document XML. L'analyseur Sax parcourt le document et appelle les méthodes de rappel de l'utilisateur. Il existe des méthodes pour le début / la fin d'un document, d'un élément, etc. Ils sont définis dans org.xml.sax.ContentHandler et il existe une classe d'assistance vide DefaultHandler.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader / Writer: Cela fonctionne avec une interface orientée flux de données. Le programme demande l'élément suivant lorsqu'il est prêt, tout comme un curseur / itérateur. Vous pouvez également créer des documents avec. Lire le document:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Rédiger le document:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: la dernière implémentation pour lire des documents XML: fait partie de Java 6 dans la v2. Cela nous permet de sérialiser des objets java à partir d'un document. Vous lisez le document avec une classe qui implémente une interface vers javax.xml.bind.Unmarshaller (vous obtenez une classe pour cela à partir de JAXBContext.newInstance). Le contexte doit être initialisé avec les classes utilisées, mais il vous suffit de spécifier les classes racines et de ne pas vous soucier des classes référencées statiques. Vous utilisez des annotations pour spécifier quelles classes doivent être des éléments (@XmlRootElement) et quels champs sont des éléments (@XmlElement) ou des attributs (@XmlAttribute, quelle surprise!)
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Rédiger le document:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Exemples copiés sans vergogne à partir de vieilles diapositives de cours ;-)
Edit: A propos de "quelle API dois-je utiliser?". Eh bien, cela dépend - toutes les API n'ont pas les mêmes capacités que vous voyez, mais si vous avez le contrôle sur les classes que vous utilisez pour mapper le document XML, JAXB est ma solution préférée, vraiment élégante et simple (même si je ne l'ai pas utilisée pour documents très volumineux, cela pourrait devenir un peu complexe). SAX est également assez facile à utiliser et restez à l'écart de DOM si vous n'avez pas vraiment de bonne raison de l'utiliser - une API ancienne et maladroite à mon avis. Je ne pense pas qu'il existe des bibliothèques tierces modernes qui présentent quelque chose de particulièrement utile qui manque à la STL et les bibliothèques standard ont les avantages habituels d'être extrêmement bien testées, documentées et stables.