Яка найкраща бібліотека для розбору XML в java [закрито]


158

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

Після відповіді @ Voo дозвольте мені запитати ще один - чи слід використовувати вбудовані класи Java або будь-яку сторонній бібліотеку, наприклад dom4j .. Які переваги?


Чи можете ви визначити добро? Продуктивність, якість API, щось інше?
Yishai

Продуктивність та простота використання (так, якість API)
Premraj

3
Ви не опублікували жодних конкретних причин не використовувати вбудовані програми Java.
Hovercraft Full Of Eels

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, а стандартні бібліотеки мають звичайні переваги - бути надзвичайно добре перевіреними, задокументованими та стабільними.


@Natix саме для цього потрібна опція "редагування". Має бути краще зараз.
Кіківа

4
@Kikiwa Виняток обробляється приблизно стільки, скільки можливо видалено з місця цієї публікації. Якщо якийсь некомпетентний програміст копіювання-вставлення продовжує копіювати фрагменти, не розуміючи їх мети, вони отримують те, що заслуговують. Не дуже хвилювався і не цікавився ними. Що я скажу, це те, що видалення блоків try / catch та показ підпису методу замість того, щоб документувати, які винятки можуть викидати різні варіанти, дозволить заощадити місце, зберігаючи цікаву інформацію. Тож якщо хтось хоче це зробити, він повинен просто йти вперед.
Во

1
(Одночасно я відхилю правки, які видаляють спробу / ловити, не позначаючи додаткової інформації іншим способом)
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

Якщо ви хочете API, схожий на DOM - тобто такий, де аналізатор XML перетворює документ у дерево вузлів елементів та атрибутів - тоді можна вибрати щонайменше чотири: 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 взагалі, якби не (a) він був визначений як стандарт і має кілька реалізацій, і (b) він за замовчуванням включений у JDK. З усіх інших точок зору, JDOM2 та XOM набагато кращі.
Майкл Кей

4

Точка Нікіти чудова: не плутайте зріле з поганим. XML не дуже змінився.

JDOM буде ще однією альтернативою DOM4J.


Кого обрати і чому?
Премрай

1
Це насправді не має великого значення. Обидва є обгортками парсерів SAX та DOM, вбудованих у JDK. Ієрархія документа W3C є багатослівною та важкою у використанні, тому і DOM4J, і JDOM намагаються полегшити її. Мені подобається Елліотт Расті Гарольд, тому я, як правило, спочатку досягаю JDOM.
duffymo

4

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


3

Для людей, зацікавлених у використанні JDOM, але вони бояться, що не оновлювалися протягом певного часу (особливо не використовуючи дженерики Java), є роздріб під назвою CoffeeDOM, який точно вирішує ці аспекти та модернізує API JDOM, читайте далі тут:

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

та завантажте його зі сторінки проекту за адресою:

https://github.com/cdmckay/coffeedom


1

VTD-XML - це важкий XML для розбору вкладки ... він краще, ніж інші, практично всіляко ... ось документ 2013 року, який аналізує всі рамки обробки XML, доступні на платформі Java ...

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


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

Це посилання мертве
нульове
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.