Какая библиотека лучше всего подходит для разбора XML в java [закрыто]

158

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

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

Premraj
источник
Можете ли вы определить хорошее? Производительность, качество API, что-то еще?
Ишай
Производительность и простота использования (да, качество API)
Premraj
3
Вы не опубликовали никаких конкретных причин для того, чтобы не использовать нативные реализации Java.
Судно на воздушной подушке, полное угрей,
vtd-xml будет лучшим выбором для производительности / использования памяти и простоты использования.
vtd-xml-author

Ответы:

213

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

Voo
источник
@Natix, поэтому опция «редактировать» предназначена для. Должно быть лучше сейчас.
Кикива,
4
@ Kikiwa Обработка исключений примерно настолько удалена от сути этого поста, насколько это возможно. Если какой-то некомпетентный программист копирует и вставляет текст и копирует фрагменты, не понимая их цели, он получает то, что заслуживает. Не очень беспокоюсь или заинтересован в них. Что я скажу, так это то, что удаление блоков try / catch и отображение подписи метода вместо того, чтобы задокументировать, какие исключения могут выдавать различные опции, сэкономит место, сохраняя при этом интересную информацию. Так что, если кто-то хочет сделать это, он должен просто идти вперед.
Во
1
(В то же время я отклоню правки, которые удаляют try / catch, не обозначая дополнительную информацию каким-либо другим способом)
Voo
Я считаю, что JAXB больше не входит в JDK в последних версиях.
Слоу
11

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/

Райх
источник
5

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

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

Майкл Кей
источник
2
DOM - это стандарт W3C ( w3.org/DOM ). Реализация этого стандарта на Java описана в стандарте JAXP ( jcp.org/en/jsr/detail?id=206 ). Затем JAXP реализуется различными провайдерами, такими как: Oracle, Apache и т. Д.
bdoughan
Действительно, никто не использовал бы DOM вообще, если бы не было (а) того, что оно было определено как стандарт и имеет несколько реализаций, и (б) оно включено в JDK по умолчанию. Со всех других точек зрения JDOM2 и XOM намного предпочтительнее.
Майкл Кей
4

Идея Никиты превосходна: не путайте зрелого с плохим. XML не сильно изменился.

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

duffymo
источник
Какой из них вы выберете и почему?
Премрай
1
Это не имеет большого значения. Оба являются обертками парсеров SAX и DOM, встроенных в JDK. Иерархия документов W3C многословна и сложна в использовании, поэтому DOM4J и JDOM пытаются упростить ее. Мне нравится Эллиот Расти Гарольд, поэтому я стремлюсь сначала к JDOM.
duffymo
4

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

ChrisJ
источник
3

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

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

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

https://github.com/cdmckay/coffeedom

ngeek
источник
1

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

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

VTD-XML-автор
источник
3
Предупреждение: VTD-XML распространяется по лицензии GPL, что эффективно исключает его в подавляющем большинстве ситуаций профессионального или коммерческого развития. Инженеры должны проконсультироваться со своим собственным адвокатом для анализа, но если вам платят за разработку, вы, скорее всего, обнаружите, что ваша организация не разрешает (и не может) использовать любые библиотеки, лицензированные по лицензии GPL.
Сара Г
Эта ссылка мертва
null