Быстрый и легкий парсер XML [закрыт]

У меня есть XML-документ определенного формата, который мне подтолкнут. Этот документ всегда будет одного типа, поэтому он очень строгий.

Мне нужно проанализировать это, чтобы я мог преобразовать его в JSON (ну, слегка искаженную версию, чтобы кто-то еще мог использовать ее с DOJO).

Мой вопрос в том, должен ли я использовать очень быстрый и легкий (нет необходимости в SAX и т. д.) анализатор XML (есть идеи?) или написать свой собственный, в основном конвертирующий в StringBuffer и прокручивающий массив? По сути, под прикрытием я предполагаю, что все парсеры HTML будут прокручивать строку (или буфер памяти) и анализировать, производя вывод по пути.

Спасибо

изменить

XML-файл будет содержать от 3/4 строк до 50 максимум (в крайнем случае).


person joe90    schedule 25.01.2010    source источник
comment
попробуйте vtd-xml и не пожалеете..   -  person vtd-xml-author    schedule 27.07.2013
comment
возможный дубликат Небольшая, минималистичная и быстрая библиотека XML для Java?   -  person Danubian Sailor    schedule 12.08.2013


Ответы (8)


Нет, вам не следует пытаться написать для этого собственный XML-парсер.

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

Если у вас есть небольшие файлы и вам не нужно беспокоиться о производительности, рассмотрите возможность использования DOM. Реализация Java может быть немного раздражающей в использовании (вы создаете документ с помощью DocumentBuilder, который исходит из DocumentBuilderFactory)

Код для создания документа из файла выглядит так:

Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream("file.xml"));

(обратите внимание, что сохранение ссылки на ваш конструктор документов ускорит работу, если вам нужно проанализировать несколько файлов)

Затем вы используете функцию в org.w3c. .dom.Document для чтения или управления содержимым. Например, getElementsByTagName() возвращает все элементы с определенным именем тега.

person Chad Okere    schedule 25.01.2010
comment
Я подозреваю, что под легким весом Джо подразумевает простоту использования; API SAX, ориентированный на обратный вызов, не самый удобный для пользователя. - person Michael Borgwardt; 25.01.2010
comment
Я бы добавил +'это больше, если бы мог. SAX — это наиболее эффективный способ чтения XML в Java. Вам будет трудно написать более правильный анализатор XML. Я думаю, должна быть возможность написать обратный вызов для прямого создания JSON. Если перевода мало, то он может быть очень крошечным. - person PSpeed; 25.01.2010
comment
@Michael Borgwardt: я думаю, что использовать DOM было бы проще, чем писать собственный синтаксический анализатор :) - person Chad Okere; 25.01.2010
comment
Но DOM определенно не легковесен. Для такого рода перевода из одного формата в другой идеально подходит SAX. Сделайте это правильно, и вы сможете работать с файлами, которые никогда не поместятся в памяти. (В данном случае он вам не понадобится, но не в этом дело. :)) - person PSpeed; 25.01.2010
comment
@PSpeed: IMHO SAX не идеален, потому что подход SAX, управляемый событиями, сложнее понять и использовать, чем подход с разбором по запросу (анализатор kXML или аналогичный). - person WildWezyr; 25.01.2010
comment
Да, у JSON есть toXML, и вы можете преобразовать JSON.XML в JSON, но мне нужно добавить дополнительные биты и изменить несколько битов, чтобы удовлетворить требования додзё. Поскольку быстрые пакеты будут очень строгими по формату и, как правило, будут состоять из 3/4 строк (максимум 50 (повторяющийся набор 3/4 строковых элементов), хранение в памяти не будет слишком большой проблемой. Спасибо. еще раз за комментарии до сих пор .. - person joe90; 25.01.2010
comment
Я думаю, что в какой-то момент тяга против толчка сводится к личному опыту. Для преобразования данных, перехода из одного формата в другой, push обычно приводит к меньшему количеству кода. И это, как правило, более многоразового использования. Пробег может варьироваться в зависимости от различных вариантов использования. Кроме того, у меня есть свои собственные утилиты SAX, которые добавляют отправку на основе имени тега и стек объектов, что иногда делает этот материал еще более тривиальным. (meta-jb.svn.sourceforge.net/viewvc/meta-jb/trunk/dev/src/main/) Сегодня я бы поступил иначе, но оно работает. - person PSpeed; 25.01.2010
comment
push + диспетчеризация хороша (например), когда вы игнорируете большие части ввода. - person PSpeed; 25.01.2010

Это действительно зависит от типа XML, который вы анализируете. Я бы не стал писать собственный синтаксический анализатор, когда уже есть что-то, что сделает эту работу за вас.

Выбор SAX/DOM действительно зависит от того, что вы пытаетесь проанализировать, см. здесь, как решить, какой из них использовать:

http://geekexplains.blogspot.com/2009/04/sax-vs-dom-differences-between-dom-and.html

Даже если вы не используете SAX/DOM, вам все равно доступны простые варианты, взгляните на Simple : )

http://simple.sourceforge.net/

Вы также можете рассмотреть STaX.

person Jon    schedule 25.01.2010
comment
Спасибо, посмотрю простой - person joe90; 25.01.2010

Возможно, вам стоит взглянуть на kXML 2, небольшой XML-парсер, специально разработанный для сред с ограничениями, для доступа, анализа и отображения XML-файлов для устройств с поддержкой Java 2 Micro Edition. Он также хорошо работает с Java SE/EE ;-). Поскольку он разработан для микроизданий, он действительно легкий (небольшой) и, ИМХО, действительно прост в использовании (намного проще, чем SAX/DOM и т. д.).

Из моего собственного опыта работы с kXML 2: я использовал его для анализа файлов XML размером более 1 ГБ - дампы Википедии, и я был очень доволен производительностью/потреблением памяти и т. д.

Наконец-то ;-) - ссылка: http://kxml.sourceforge.net/kxml2/

person WildWezyr    schedule 25.01.2010
comment
Спасибо,. посмотрю на это :), так как в какой-то момент нам понадобится и мобильная версия - person joe90; 25.01.2010

вы можете использовать Dom4j/xstream для чтения xml в эквивалентный модальный Java, а затем использовать JSONLIB для преобразования в JSON.

person Teja Kantamneni    schedule 25.01.2010
comment
+ Dom4j имеет SAX-подобный API, но проще. - person Ondra Žižka; 25.01.2010

Вам действительно нужно анализировать/манипулировать какими-либо данными в XML-документе? Если нет, вы можете просто создать XSLT. Очень просто, очень быстро.

person Bal    schedule 14.10.2010
comment
XSLT был разработан для преобразования XML, поэтому использование его для преобразования в JSON — хорошая идея. - person james.garriss; 20.01.2017

Используйте настоящий синтаксический анализатор XML. Если вы этого не сделаете, вас, вероятно, укусят, когда что-то изменится. Документ может быть «очень строгим», но через два года что-то, вероятно, подвергнется рефакторингу, и он изменит структуру, чтобы он анализировал ту же структуру данных с помощью синтаксического анализатора XML и ломал доморощенный синтаксический анализатор строк.

person Quentin    schedule 25.01.2010
comment
Я вижу, вы указываете, но уже в разных областях (то есть на следующем шаге в цепочке) у них есть биты изменений из чистого json, чтобы удовлетворить свои требования. - person joe90; 25.01.2010
comment
Таким образом, анализатор не совсем JSON настроен на падение, но нет необходимости усугублять проблему, вводя ту же проблему с использованием анализатора не совсем XML. - person Quentin; 26.01.2010

синтаксический анализ на бэкэнде и раскрытие JSON, вероятно, является правильным путем, чтобы у вас были данные JSON общего назначения, которые вы можете легко интегрировать с другими источниками, но если у вас есть простое сообщение, и это единственное место, где вы думаете, что вам нужно использовать JSON, вы можете попробовать выполнить синтаксический анализ на стороне клиента. В Dojo есть экспериментальный анализатор XML на стороне клиента.

person peller    schedule 25.01.2010

Обязательно ли использовать XML?

Я обнаружил, что мой собственный текстовый формат был намного быстрее, чем XML или JSON с любым из готовых пакетов — они были быстрыми, но, контролируя свой собственный формат и просто выполняя синтаксический анализ строк, я смог сократить время вдвое по сравнению с самая быстрая реализация XML.

Очевидно, это работает только в том случае, если вы полностью отвечаете за форматы и может не соответствовать вашей ситуации, но для всех остальных в этой ситуации: не думайте, что XML - это самый быстрый вариант, который у вас есть. Это не.

person Brian    schedule 17.06.2010