Как десериализовать объекты Java из XML? - PullRequest
1 голос
/ 11 ноября 2010

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

Проблема: У нас есть некоторые большие XML-данные (от 100 КБ до 5 МБ), которые нам нужно накачать в объекты Java.Проблема в том, что данные на самом деле не очень хорошо отображаются на объекте, поэтому нам нужно только извлечь некоторые части данных и создать объекты.Учитывая это, такие решения, как JAXB или XStream, действительно не подходят.

Итак, нам нужно извлечь данные XML и поместить их в объекты Java с максимальной эффективностью.

Возможные решения: На мой взгляд, у нас есть 3 возможных решения:

  • SAX-разбор
  • DOM-разбор
  • XSLT

Мы можем загрузитьXML в любую реализацию JAXP и извлеките данные одним из перечисленных выше методов.

Вопрос (ы) У меня есть несколько вопросов / проблем:

  • Как XSLT работает под капотом?Это просто DOM-парсер?Я спрашиваю, потому что XSLT кажется хорошим способом, но я не очень хочу об этом думать, если он не даст нам лучшую производительность, чем DOM.
  • Какие популярные библиотеки предоставляют DOM, XSLTи SAX XML парсеры?
  • По вашему опыту, каковы причины выбора DOM, SAX или XSLT?Относится ли простота использования DOM или XSLT к улучшениям производительности, предлагаемым SAX?
  • Есть ли какие-либо критерии?Те, что я нашел, старые (как в, 8 лет).Поэтому некоторые недавние тесты были бы признательны.
  • Есть ли какие-либо другие решения, кроме описанных выше, которые я мог бы пропустить?

Edit: Несколько пояснений ... Вы можете использовать XSLT для непосредственного введения значений в объект Java ... обычно он используется для преобразования XML в какой-то другой XML, однако я говорю с точки зрения вызова метода из XSLT в java длявведите значение.Я до сих пор не понимаю, как именно работает процессор XSLT ... Как он подает XML в код XSLT, который вы пишете?

Ответы [ 5 ]

3 голосов
/ 11 ноября 2010

Используйте XSLT для преобразования больших файлов XML в модель локального домена, которая сопоставляется с объектами Java с помощью JAXB.

Начните с JDK 5+, встроенных в библиотеки XML (если только вам абсолютно не нужен XSLT 2.0, в этом случае используйте Saxon)

Не сосредотачивайтесь на относительной производительности SAX / DOM, сосредоточьтесь на том, как писать выражения XPath и использовать XSLT, а затем беспокоитесь о производительности позже, если и только если вы обнаружите, что это проблема.

Редакторы Eclipse XML хороши, но если вы можете себе это позволить, используйте Oxygen XML, который позволит вам выполнять оценку XPath в реальном времени.

2 голосов
/ 11 ноября 2010

JAXB , Java API для привязки XML может быть тем, что вам нужно.Вы используете его, чтобы накачать документ XML в граф объектов Java, состоящий из «объектов содержимого Java».Эти объекты содержимого являются экземплярами классов, сгенерированных JAXB для соответствия схеме XML-документа

Но если у вас уже есть набор классов Java или еще нет схемы для документа, JAXB, вероятно, нелучший способ пойти.Я бы предложил выполнить синтаксический анализ SAX, а затем создать ваши объекты Java во время синтаксического анализа.В качестве альтернативы вы можете попробовать анализ DOM, а затем пройтись по результирующему дереву документов, чтобы извлечь интересующие вас части (возможно, с XPath), но 5 МБ XML могут превратиться в 50 МБ объектов дерева DOM в Java.

2 голосов
/ 11 ноября 2010

У нас была похожая ситуация, и я просто собрал код XPath, который проанализировал все, что мне нужно.

Это было удивительно быстро даже для файлов 100k + XML. Мы пошли настолько низко, насколько это возможно. Мы обрабатываем около 1000 файлов в день такого размера, и время разбора очень мало. У нас нет проблем с памятью, утечек и т. Д.

Мы написали быстрый прототип в Groovy (если память у меня точная) - проверка концепции заняла у меня около 10 минут

1 голос
/ 11 ноября 2010

Вы можете использовать расширение @XmlPath в EclipseLink JAXB (MOXy) , чтобы легко обрабатывать этот вариант использования.Для подробного примера см .:

Пример кода:

package blog.geocode;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="kml")
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
    private String street;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
    private String city;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
    private String state;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
    private String country;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
    private String postalCode;

}
1 голос
/ 11 ноября 2010

DOM, SAX и XSLT - разные животные.

Анализ DOM загружает весь документ в память, которая будет работать от 100 КБ до 5 МБ (очень мало по сегодняшним стандартам).

SAX - это анализатор потока, который читает XML и доставляет события в вашкод для каждого тега.

XSLT - это система для преобразования одного дерева XML в другое.Даже если вы написали преобразование, которое преобразует входные данные в более подходящий формат, вам все равно придется написать что-то, используя DOM или SAX, чтобы преобразовать его в объекты Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...