Какую библиотеку Java XML вы рекомендуете (вместо dom4j)?
Я ищу что-то вроде dom4j, но без бородавок dom4j, таких как плохая или отсутствующая документация и, казалось бы, застопорившийся статус разработки.
Предыстория: я использовал и защищал dom4j, но не чувствую себя полностью правым, потому что я знаю, что библиотека далека от оптимальной (пример: посмотрите, как документированы методы в классе таблиц стилей, связанных с XSLT; что вы передадите для запуска () как String mode
параметр?)
Требования: библиотека должна сделать базовую обработку XML проще, чем при использовании чистого JDK (javax.xml
а также org.w3c.dom
пакеты). Вещи как это:
- Считайте XML-документ (из файла или строки) в объект, легко просматривайте и манипулируйте DOM, выполняйте запросы XPath и запускайте XSLT для него.
- Создайте XML-документ в своем коде Java, добавьте элементы, атрибуты и данные и, наконец, запишите документ в файл или строку.
Мне действительно нравится то, что обещает dom4j: " простая в использовании библиотека с открытым исходным кодом для работы с XML, XPath и XSLT [...] с полной поддержкой DOM, SAX и JAXP". А готовящийся к выпуску dom4j 2.0 действительно исправляет все: полностью использовать Java 5 и добавить недостающую документацию. Но, к сожалению, если вы посмотрите ближе:
Предупреждение: dom4j 2.0 находится в пре-альфа-стадии. Вероятно, это не может быть скомпилировано. В случае, если он может быть скомпилирован случайным образом, скорее всего, он не сможет работать. В случае, если он запускается время от времени, он может внезапно взорваться. Если вы хотите использовать dom4j, вам нужна версия 1.6.1. В самом деле.
... и веб-сайт сказал это в течение долгого времени. Так есть ли хорошая альтернатива dom4j? Пожалуйста, предоставьте некоторые обоснования для предпочитаемой вами библиотеки, а не просто добавляйте имена и ссылки.:-)
11 ответов
Конечно, XOM:-)
XOM разработан, чтобы быть простым в освоении и использовании. Это работает очень прямо, и имеет очень мелкую кривую обучения. Предполагая, что вы уже знакомы с XML, вы сможете очень быстро приступить к работе с XOM.
Я использую XOM уже несколько лет, и мне все еще очень нравится. Простой в использовании, множество документации и статей в Интернете, API не меняется между выпусками. 1.2 был выпущен недавно.
XOM является единственным XML API, который не ставит под угрозу правильность. XOM принимает только правильно сформированные XML-документы пространства имен и позволяет создавать только правильно сформированные XML-документы пространства имен. (На самом деле, это немного строже, чем это: на самом деле это гарантирует, что все документы имеют возможность многократного использования и имеют четко определенные инфо-наборы XML.) XOM управляет вашим XML, поэтому вам не нужно этого делать. С XOM вы можете сосредоточиться на уникальной ценности вашего приложения и доверять XOM, чтобы получить правильный XML.
Посетите веб-страницу http://www.xom.nu/, где вы найдете ответы на часто задаваемые вопросы, кулинарную книгу, обоснование дизайна и т. Д. Если бы все было разработано с такой большой любовью:-)
Автор также написал о том, что не так с XML API (и как их исправить). (В основном, причины, по которым XOM существует в первую очередь)
Вот также интервью с автором из 5 частей Artima о XOM, где они рассказывают о том, что не так с XML API, The Good, the Bad и DOM, обзор дизайна JDOM, уроки, извлеченные из JDOM, и, наконец, принципы проектирования и XOM.
Тот, что встроен в JDK... с несколькими дополнениями.
Да, это болезненно использовать: он смоделирован по спецификациям W3C, которые были четко разработаны комитетом. Тем не менее, он доступен везде, и если вы остановитесь на нем, вы не столкнетесь с аргументами "мне нравится Dom4J", "мне нравится JDOM", "мне нравится StringBuffer", которые поступают из сторонних библиотек. Тем более что такие аргументы могут превращаться в разные куски кода с использованием разных библиотек...
Однако, как я уже сказал, я немного улучшился: библиотека Practical XML представляет собой набор служебных классов, облегчающих работу с DOM. Кроме оболочки XPath, здесь нет ничего сложного, просто набор подпрограмм, которые я переписывал для каждой работы.
Я использовал XMLTool для замены Dom4j, и он работает довольно хорошо.
Инструмент XML использует шаблон интерфейса Fluent для упрощения манипуляций с XML:
XMLTag tag = XMLDoc.newDocument(false)
.addDefaultNamespace("http://www.w3.org/2002/06/xhtml2/")
.addNamespace("wicket", "http://wicket.sourceforge.net/wicket-1.0")
.addRoot("html")
.addTag("wicket:border")
.gotoRoot().addTag("head")
.addNamespace("other", "http://other-ns.com")
.gotoRoot().addTag("other:foo");
System.out.println(tag.toString());
Это сделано для Java 5, и легко создать итерируемый объект для выбранных элементов:
for (XMLTag xmlTag : tag.getChilds()) {
System.out.println(xmlTag.getCurrentTagName());
}
Мне всегда нравился JDOM. Это было написано, чтобы быть более интуитивным, чем анализ DOM (и SAX-анализ всегда кажется неуклюжим в любом случае).
Из миссии:
Нет никаких веских причин для API Java манипулировать XML, чтобы он был сложным, хитрым, не интуитивно понятным или причинял боль. JDOMTM ориентирован как на Java, так и на Java. Он ведет себя как Java, он использует коллекции Java, он является абсолютно естественным API для современных разработчиков Java и предоставляет недорогую точку входа для использования XML.
Это был мой опыт - довольно интуитивная навигация по деревьям узлов.
Я использую XStream, его простую библиотеку для сериализации объектов в XML и обратно.
он может быть основан на аннотациях (например, JAXB), но у него очень простой и удобный API, и вы даже можете генерировать JSON.
Я добавлю к встроенному ответу @kdgregory, сказав, почему не JAXB?
С несколькими аннотациями довольно легко моделировать большинство документов XML. Я имею в виду, что вы, вероятно, собираетесь разобрать материал и положить объект правильно?
JAXB 2.0 встроен в JDK 1.6 и, в отличие от многих других встроенных библиотек javax, он довольно хорош (Kohusuke работал над этим, так что вы знаете его хорошо).
В одном из недавних проектов мне пришлось немного разобрать XML, и в итоге я использовал Simple Framework, рекомендованный коллегой.
Я был вполне доволен этим в конце концов. Он использует основанный на аннотациях подход отображения элементов и атрибутов XML на классы и поля Java.
<example>
<a>
<b>
<x>foo</x>
</b>
<b>
<y>bar</y>
</b>
</a>
</example>
Соответствующий код Java:
@Root
public class Example {
@Path("a/b[1]")
@Element
private String x;
@Path("a/b[2]")
@Element
private String y;
}
Все это сильно отличается от dom4j или XOM. Вы избегаете писать глупый, неуклюжий код обработки XML, но сначала вы, вероятно, некоторое время стучите головой о стену, пытаясь получить правильные аннотации.
(Это я задавал этот вопрос 4 года назад. Хотя XOM кажется достойной и довольно популярной заменой dom4j, я не смог полностью принять его. Любопытно, что никто не упомянул здесь Simple Framework. Я решил это исправить, как я, вероятно, использовал бы это снова.)
В нашем проекте мы используем http://www.castor.org/ но только для небольших файлов XML. Его действительно легко изучить, ему нужен просто файл сопоставления XML (или его нет, если теги XML полностью соответствуют атрибутам класса), и все готово. Он поддерживает слушателей (например, обратные вызовы) для выполнения дополнительной обработки. Минусы: это не стандарт Java EE, как JAXB.
Я иногда использую Jericho, который в первую очередь является HTML-парсером, но может анализировать любую XML-подобную структуру.
Конечно, это только для самых простых операций XML, таких как поиск тегов с заданным именем, итерация по структуре, замена тегов и их атрибутов, но разве это не самый распространенный вариант использования?
Вы можете попробовать JAXB с аннотациями, которые очень удобны и просты: Java Architecture для XML Binding.