Что является лучшей библиотекой для синтаксического анализа XML в java

Я ищу библиотеку java для разбора XML (сложные файлы конфигурации и данных), я немного погуглил, но не смог найти ничего, кроме dom4j (похоже, они работают на V2). Не нравится, Другие проекты Apache на XML кажутся в спящем режиме. Я не оценивал dom4j самостоятельно, но просто хотел знать - есть ли в java другие (хорошие) библиотеки с открытым исходным кодом для разбора xml? а как твой опыт работы с dom4j?

После ответа @Voo позвольте мне задать еще один вопрос: использовать ли встроенные классы Java или какую-либо стороннюю библиотеку, например, dom4j.. В чем преимущества?

Ответ 1

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

Ответ 2

Java поддерживает два метода синтаксического анализа XML из коробки.

SAXParser

Вы можете использовать этот синтаксический анализатор, если вы хотите анализировать большие XML файлы и/или не хотите использовать много памяти.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

Пример: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

Вы можете использовать этот синтаксический анализатор, если вам нужно выполнить запросы XPath или вам нужна полная DOM.

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

Пример: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

Ответ 3

Никита-точка отличная: не путайте зрелых с плохими. XML не сильно изменился.

JDOM будет другой альтернативой DOM4J.

Ответ 4

Вам не нужна внешняя библиотека для синтаксического анализа XML на Java. Java со встроенными реализациями для SAX и DOM уже давно.

Ответ 5

Если вам нужен DOM-подобный API, то есть тот, где синтаксический анализатор XML превращает документ в дерево узлов Element и Attribute, тогда есть как минимум четыре варианта: DOM, JDOM, DOM4J и XOM. Единственная возможная причина использования DOM заключается в том, что она воспринимается как стандарт и поставляется в JDK: во всех остальных отношениях все являются превосходными. Мое предпочтение, за его сочетание простоты, мощности и производительности, - это XOM.

И, конечно же, существуют и другие типы обработки: низкоуровневые парсер-интерфейсы (SAX и StAX), интерфейсы привязки объектов данных (JAXB) и высокоуровневые декларативные языки (XSLT, XQuery, XPath). Это лучше всего зависит от ваших требований к проекту и вашего личного вкуса.

Ответ 6

Для людей, заинтересованных в использовании JDOM, но боюсь, что это не обновлялось через некоторое время (особенно, не используя Java generics), есть вилка под названием CoffeeDOM, которая точно решает эти аспекты и модернизирует JDOM API, читайте здесь:

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

и загрузите его со страницы проекта по адресу:

https://github.com/cdmckay/coffeedom

Ответ 7

VTD-XML - это мощная библиотека синтаксического анализа XML... она лучше других практически во всех отношениях... вот документ в 2013 году, в котором анализируются все платформы обработки XML, доступные в java-платформе...

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf