Поддержка библиотек XML в Java
1. Введение
В этой статье мы будем сравнивать библиотеки Java XML и API.
Это вторая статья из серии о поддержке Java для XML, если вы хотите пойти глубже в поддержку XPath в Java посмотрите на предыдущую статью .
2. Обзор
Теперь мы собираемся углубиться в мировую поддержку XML, и для этого мы собираемся начать с объяснения как можно более простых всех связанных с предметом инициалов.
В поддержке Java XML мы можем найти несколько определений API, каждый из которых имеет свои плюсы и минусы.
• SAX : Это событие на основе разбора API, он обеспечивает низкий уровень доступа, является память эффективной и быстрее, чем DOM, поскольку он не загружает все дерево документов в памяти, но он не обеспечивает поддержку навигации, как тот, предоставляемый XPath, хотя это более эффективно, это труднее использовать тоже.
• ДОМ : Это как модель на основе парсера, который загружает документ структуры дерева в памяти, так что у нас есть оригинальный заказ элементов, мы можем перемещаться наш документ в обоих направлениях, он обеспечивает API для чтения и записи, он предлагает XML манипуляции и это очень проста в использовании, хотя цена высокая нагрузка на ресурсы памяти.
• StAX : Он предлагает простоту DOM и эффективность SAX, но ему не хватает некоторой функциональности, предоставляемой DOM, как XML манипуляции, и это только позволяет нам перемещаться по документу вперед.
• JAXB : Это позволяет нам перемещаться по документу в обоих направлениях, он более эффективен, чем DOM, он позволяет преобразование из XML в Java типов и он поддерживает XML манипуляции, но он может только разобрать действительный документ XML.
Вы все еще можете найти некоторые ссылки на JAXP, но последний релиз этого проекта с марта 2013 года, и он практически мертв.
Таблица API XML
3. XML
В этом разделе мы увидим самые популярные реализации, чтобы мы могли протестировать реальные рабочие образцы и проверить различия между ними.
В следующих примерах мы будем работать с простым файлом XML со структурой, как это:
... Guava Introduction to Guava 04/04/2016 GuavaAuthor
4. DOM4J
Начнем с того, что посмотрим, что мы можем сделать с DOM4J и для этого примера нам нужно добавить последнюю версию этого зависимость .
Это одна из самых популярных библиотек для работы с XML файлов, так как это позволяет нам выполнять двунастное чтение, создавать новые документы и обновлять существующие.
DOM4J может работать с ДОМ , SAX , XPath и XLST . SAX поддерживается через JAXP .
Давайте посмотрим здесь, например, как мы можем выбрать элемент фильтрации по данному идентификатору.
SAXReader reader = new SAXReader(); Document document = reader.read(file); Listelements = document.selectNodes("//*[@tutId='" + id + "']"); return elements.get(0);
SAXЧитатель класс отвечает за создание DOM4J дерево из SAX разбор событий. Как только у нас будет org.dom4j.Документ нам просто нужно вызвать необходимый метод и передать ему XPath выражение как струна.
Мы можем загрузить существующий документ, внести изменения в его содержимое, а затем обновить исходный файл.
for (Node node : nodes) { Element element = (Element)node; Iteratoriterator = element.elementIterator("title"); while (iterator.hasNext()) { Element title =(Element)iterator.next(); title.setText(title.getText() + " updated"); } } XMLWriter writer = new XMLWriter( new FileWriter(new File("src/test/resources/example_updated.xml"))); writer.write(document); writer.close();
В приведенной выше примере мы меняем содержание каждого заголовка и создаем новый файл.
Обратите внимание здесь, как это просто, чтобы получить каждый титул узел в списке, позвонив элементИтератор и передача имени узел.
После того, как мы изменили наше содержание, мы будем использовать XMLWriter что занимает DOM4J дерево и форматирует его в поток, как XML .
Создание нового документа с нуля так же просто, как мы видим ниже.
Document document = DocumentHelper.createDocument(); Element root = document.addElement("XMLTutorials"); Element tutorialElement = root.addElement("tutorial").addAttribute("tutId", "01"); tutorialElement.addAttribute("type", "xml"); tutorialElement.addElement("title").addText("XML with Dom4J"); ... OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter( new FileWriter(new File("src/test/resources/example_new.xml")), format); writer.write(document); writer.close();
ДокументХельпер дает нам набор методов для использования DOM4J , такие как создатьДокумент который создает пустой документ, чтобы начать работать с ним.
Мы можем создать столько атрибутов или элементов, сколько нам нужно с помощью методов, предоставляемых DOM4J , и как только мы наш документ завершен мы просто написать его в файл, как мы сделали с обновлением случае раньше.
5. ДЖДОМ
Для того, чтобы работать с ДЖДОМ, мы должны добавить этот зависимость к нашему пом.
JDOM’s стиль работы очень похож на Dom4J в , так что мы собираемся взглянуть на только несколько примеров:
SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(this.getFile()); Element tutorials = doc.getRootElement(); Listtitles = tutorials.getChildren("tutorial");
В приведеном выше примере мы извлекаем все элементы из корневого элемента очень простым способом, как мы можем сделать с DOM4J:
SAXBuilder builder = new SAXBuilder(); Document document = (Document) builder.build(file); String filter = "//*[@tutId='" + id + "']"; XPathFactory xFactory = XPathFactory.instance(); XPathExpressionexpr = xFactory.compile(filter, Filters.element()); List node = expr.evaluate(document);
Опять же, здесь, в коде выше, у нас есть SAXBuilder создание Документ экземпляр из данного файла. Мы извлекаем элемент его tutId атрибут, передавая XPath выражение XPathFactory предоставлено JDOM2.
6. StAX
Теперь мы увидим, как мы могли бы получить все элементы из нашего корневого элемента с помощью Stax API . Stax включена в JDK с Java 6, так что вам не нужно добавлять какие-либо зависимости.
Во-первых, нам нужно создать Учебный класс:
public class Tutorial { private String tutId; private String type; private String title; private String description; private String date; private String author; // standard getters and setters }
и тогда мы готовы следовать с:
Listtutorials = new ArrayList<>(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(this.getFile())); Tutorial current; while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement(); String qName = startElement.getName().getLocalPart(); ... break; case XMLStreamConstants.CHARACTERS: Characters characters = event.asCharacters(); ... break; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement(); // check if we found the closing element // close resources that need to be explicitly closed break; } }
В приведеном выше примере, чтобы помочь нам получить информацию, нам нужно было создать класс для хранения полученных данных.
Чтобы прочитать документ, мы объявили, что называется обработчики событий, и мы использовали их для навигации нашего документа вперед. Помните, что реализации SAX не обеспечивают двунавигационной навигации. Как вы можете видеть здесь, многое еще предстоит сделать только для того, чтобы получить простой список элементов.
7. ДЖАКСБ
JAXB входит в JDK , а также Xerces, se не нуждаются в дополнительной зависимости для этого.
Очень просто загружать, создавать и манипулировать информацией из XML файл с использованием JAXB .
Нам просто нужно создать правильные сущности Java, чтобы связать XML и все.
JAXBContext jaxbContext = JAXBContext.newInstance(Tutorials.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Tutorials tutorials = (Tutorials) jaxbUnmarshaller.unmarshal(this.getFile());
В приведенной выше примере мы загружаем наши XML файл в наш объект, а оттуда мы можем обрабатывать все, как нормальная структура Java;
Создать новый документ так же просто, как читать его, но делать наоборот, как это делается в приведеном ниже коде.
Во-первых, мы собираемся изменить наши Учебный класс для добавления JAXB аннотации к геттеры и сеттеры :
public class Tutorial { ... public String getTutId() { return tutId; } @XmlAttribute public void setTutId(String tutId) { this.tutId = tutId; } ... @XmlElement public void setTitle(String title) { this.title = title; } ... } @XmlRootElement public class Tutorials { private Listtutorial; // standard getters and setters with @XmlElement annotation }
С @XmlRootElement мы определяем, какой объект будет представлять корневой узел нашего документа, а затем используем @XmlAttribute или @XmlElement определить, представляет ли этот атрибут атрибут узла или элемент документа.
Тогда мы можем следовать с:
Tutorials tutorials = new Tutorials(); tutorials.setTutorial(new ArrayList<>()); Tutorial tut = new Tutorial(); tut.setTutId("01"); ... tutorials.getTutorial().add(tut); JAXBContext jaxbContext = JAXBContext.newInstance(Tutorials.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(tutorials, file);
Как вы можете видеть, связывание файла XML с объектами Java является самым простым способом работы с такого рода файлами.
8. Поддержка выражения XPath
Для создания сложных выражений XPath мы можем использовать Jaxen. Это библиотека XPath с открытым исходным кодом, адаптируемая к различным моделям объектов, включая ДОМ , XOM , DOM4J , и ДЖДОМ.
Мы можем создавать выражения XPath и компилировать их по многим поддерживаемым документам.
String expression = "/tutorials/tutorial"; XPath path = new DOMXPath(expression); List result = path.selectNodes(xmlDocument);
Чтобы заставить его работать, мы должны добавить этот зависимость к нашему проекту.
9. Заключение
Как вы можете видеть Есть много вариантов для работы с XML , в зависимости от требований вашего приложения, вы можете работать с любым из них или вам, возможно, придется выбирать между эффективностью и простотой.
Вы можете найти полные рабочие образцы для этой статьи в нашем хранилище git здесь .