На самом деле Java поддерживает 4 метода для анализа XML из коробки:
DOM Parser / Builder: вся структура XML загружается в память, и вы можете использовать хорошо известные методы DOM для работы с ней. DOM также позволяет записывать в документ преобразования Xslt. Пример:
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: исключительно для чтения XML-документа. Парсер Sax проходит через документ и вызывает методы обратного вызова пользователя. Существуют методы для начала / конца документа, элемента и так далее. Они определены в org.xml.sax.ContentHandler, и есть пустой вспомогательный класс 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: работает с интерфейсом, ориентированным на поток данных. Программа запрашивает следующий элемент, когда он готов, как курсор / итератор. Вы также можете создавать документы с ним. Читать документ:
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
}
}
}
Написать документ:
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: новейшая реализация для чтения XML-документов: является частью Java 6 в v2. Это позволяет нам сериализовать объекты Java из документа. Вы читаете документ с помощью класса, который реализует интерфейс к javax.xml.bind.Unmarshaller (вы получаете класс для этого из JAXBContext.newInstance). Контекст должен быть инициализирован с использованием используемых классов, но вам просто нужно указать корневые классы и не беспокоиться о статических ссылочных классах. Вы используете аннотации, чтобы указать, какие классы должны быть элементами (@XmlRootElement), а какие поля являются элементами (@XmlElement) или атрибутами (@XmlAttribute, какой сюрприз!)
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);
}
}
Написать документ:
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);
}
}
Примеры бесстыдно скопированы с некоторых старых лекционных слайдов ;-)
Изменить: о "какой API я должен использовать?" Ну, это зависит - не все API имеют такие же возможности, как вы видите, но если у вас есть контроль над классами, которые вы используете для отображения XML-документа, JAXB - мое личное любимое, действительно элегантное и простое решение (хотя я не использовал его для действительно большие документы, это может быть немного сложным). SAX также довольно прост в использовании и просто держитесь подальше от DOM, если у вас нет веской причины использовать его - старый, неуклюжий API, на мой взгляд. Я не думаю, что есть какие-либо современные сторонние библиотеки, в которых есть что-то особенно полезное, чего не хватает в STL, а стандартные библиотеки имеют обычные преимущества: они чрезвычайно хорошо протестированы, документированы и стабильны.