W rzeczywistości Java obsługuje 4 metody analizowania XML po wyjęciu z pudełka:
Parser / Builder DOM: Cała struktura XML jest ładowana do pamięci i możesz używać dobrze znanych metod DOM do pracy z nią. DOM umożliwia również pisanie w dokumencie z przekształceniami Xslt. Przykład:
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: wyłącznie do odczytu dokumentu XML. Parser Saxa przegląda dokument i wywołuje metody wywołania zwrotnego użytkownika. Istnieją metody na początek / koniec dokumentu, elementu i tak dalej. Są zdefiniowane w org.xml.sax.ContentHandler i istnieje pusta klasa pomocnicza 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: Działa z interfejsem zorientowanym na strumień danych. Program prosi o następny element, gdy jest gotowy, tak jak kursor / iterator. Możesz także tworzyć za jego pomocą dokumenty. Przeczytaj dokument:
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
}
}
}
Napisz dokument:
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: Najnowsza implementacja do odczytu dokumentów XML: Jest częścią Java 6 w wersji 2. To pozwala nam serializować obiekty Java z dokumentu. Czytasz dokument z klasą, która implementuje interfejs do javax.xml.bind.Unmarshaller (klasę do tego dostajesz z JAXBContext.newInstance). Kontekst musi zostać zainicjowany przy użyciu używanych klas, ale wystarczy określić klasy główne i nie trzeba martwić się o klasy statyczne, do których istnieją odwołania. Używasz adnotacji, aby określić, które klasy powinny być elementami (@XmlRootElement), a które pola są elementami (@XmlElement) lub atrybutami (@XmlAttribute, co za niespodzianka!)
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);
}
}
Napisz dokument:
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);
}
}
Przykłady bezwstydnie skopiowane ze starych slajdów z wykładów ;-)
Edycja: informacje o tym, „którego interfejsu API mam użyć?”. Cóż, to zależy - nie wszystkie API mają takie same możliwości, jak widzisz, ale jeśli masz kontrolę nad klasami używanymi do mapowania dokumentu XML, JAXB jest moim ulubionym, naprawdę eleganckim i prostym rozwiązaniem (chociaż nie używałem go do naprawdę duże dokumenty, może się trochę skomplikować). SAX jest również dość łatwy w użyciu i po prostu trzymaj się z dala od DOM, jeśli nie masz naprawdę dobrego powodu, aby go używać - moim zdaniem stary, niezgrabny interfejs API. Nie sądzę, aby istniały żadne nowoczesne biblioteki innych firm, które zawierają coś szczególnie przydatnego, czego brakuje w STL, a standardowe biblioteki mają zwykłe zalety, ponieważ są wyjątkowo dobrze przetestowane, udokumentowane i stabilne.