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

103

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

После ответа @Voo позвольте мне спросить другого - Должен ли я использовать java в построенных классах или в любой третьей библиотеке, например dom4j.. В чем преимущества?

  • 0
    Можете ли вы определить хорошее? Производительность, качество API, что-то еще?
  • 0
    Производительность и простота использования (да, качество API)
Показать ещё 2 комментария
Теги:
parsing

7 ответов

157
Лучший ответ

На самом деле 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 shoild я использую?". Ну, это зависит - не все API имеют те же возможности, что и вы, но если у вас есть контроль над классами, которые вы используете для сопоставления XML-документа, JAXB - это мое личное любимое, действительно элегантное и простое решение (хотя я не использовал его для действительно большие документы, это может стать немного сложным). SAX довольно прост в использовании и просто держитесь подальше от DOM, если у вас нет по-настоящему веской причины использовать его - старый, неуклюжий API, на мой взгляд. Я не думаю, что есть современные библиотеки сторонних разработчиков, которые показывают что-то особенно полезное, что недостающие из stl и стандартных библиотек имеют обычные преимущества: быть очень хорошо протестированным, документированным и стабильным.

  • 0
    @Natix, поэтому опция «редактировать» предназначена для. Должно быть лучше сейчас.
  • 4
    @ Kikiwa Обработка исключений примерно настолько удалена от сути этого поста, насколько это возможно. Если какой-то некомпетентный программист копирует и вставляет текст и копирует фрагменты, не понимая их цели, они получают то, что заслуживают. Не очень беспокоюсь или заинтересован в них. Что я скажу, так это то, что удаление блоков try / catch и отображение подписи метода вместо того, чтобы документировать, какие исключения могут выдавать различные опции, сэкономит место, сохраняя при этом интересную информацию. Так что, если кто-то хочет сделать это, он должен просто идти вперед.
Показать ещё 2 комментария
6

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

Для людей, заинтересованных в использовании 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

3

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

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

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

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

2

Если вам нужен 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 и т. Д.
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню