Насправді 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, а стандартні бібліотеки мають звичайні переваги - бути надзвичайно добре перевіреними, задокументованими та стабільними.