2010-11-20 2 views
27

Что такое разные подходы к преобразованию Java Objects в XML, Я знаю один вариант: JAXB, но хотелось бы знать, что другие approaches/tools доступны для него?Преобразование Java в XML?

Примечание: У меня нет дополнительных требований, и поэтому я не могу добавить больше meat к вопросу, но на данный момент времени, было бы очень здорово, если я могу получить представление о том, что различные подходы для преобразование Java to XML?

Update: Различные предложенные подходы:

  1. javax.xml.bind.Marshaller и javax.xml.bind.Unmarshaller
  2. XStream
  3. XMLBean
  4. JAXB
  5. Castor
  6. JIBX
  7. Apache Digester

В настоящее время среди всех предлагаемых подходов, что является ЛУЧШИЙ подход идти конвертировать Java Objects to XML и XML to Java Objects?

+0

Раньше я использовал XStream. Это было относительно не мучительно и гибко - но гибкость исходит из возможности расширения/добавления разные посетители в самом коде и некоторые фанки XML/XSD или DSL. – 2010-11-20 05:41:24

+0

Итак, как 'XStream' складывается с' JAXB'? – Rachel

+0

Вот мое сравнение JAXB и XStream: http://bdoughan.blogspot.com/2010 /10/how-does-jaxb-compare-to-xstream.html, как я уже ранее признал, что я выполняю реализацию JAXB, но считаю, что сравнение справедливое. Я сделал аналогичное сравнение между JAXB и Simple XML и Simple XML сайт добавляет его в свой раздел статей. –

ответ

30

JAXB - это стандартный и лучший подход для покрытия объектов Java в XML.Есть несколько реализаций с открытым исходным кодом:

  • EclipseLink MOXy (я тек свинец)
  • Metro (эталонная реализация, включенный в Java SE 6)
  • JaxMe

Для более информация о JAXB проверить мой блог:

UPDATE:

Что такое лучший подход?

Это в конечном счете, зависит от того, что вы пытаетесь сделать, я объясню ниже:

Use Case # 1 - Запуск из XML-схемы

В этом случае использования вы имеете в XML схемы, и вы хотите создать Java-модель. Не многие из упомянутых в этом потоке инструментов поддерживают этот вариант использования. XStream for example recommends XMLBeans for this.

Номинанты:

  • JAXB (все реализации) - Формирует POJO, с JAXB аннотации.
  • XMLBeans - генерирует собственные классы, которые включают логику привязки XML.

Use Case # 2 - Начиная с Java классов (которые можно редактировать)

В случае использования у вас есть гораздо больше выбора (только XMLBeans исключается). Обычно редактирование включает добавление аннотаций для управления отображением.

Номинанты:

  • Все, но XMLBeans

Use Case # 3 - Запуск формы классов Java (которые вы можете не редактировать)

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

Номинанты:

  • EclipseLink JAXB (Moxy) - предлагает external binding file, и метаданные могут быть применены программно.
  • Metro JAXB - Можно использовать Annox или JAXBIntroductions
  • Кастор - предлагает внешний связывающую файл
  • JiBX - предлагает внешний связыванию файл
  • XStream - Метаданные могут быть применены программно

Use Case # 4 - Встреча в среднем (существующие классы и схема)

В этом случае у вас есть существующие классы, которые вам нужны ap к существующей схеме XML. EclipseLink Moxy с его XPath based mapping является единственным инструментом, я знаю, что могу справиться с этим вариантом использования

Номинанты:

  • EclipseLink JAXB (Moxy)

Use Case # 5 - XML Infoset Preservation:

В этом случае вам необходимо сохранить немаркированный контент: комментарии, инструкции по обработке и т. Д.

Номинанты:

  • JAXB (все реализации) - Имеет функцию Binder.
  • XMLBeans - Сгенерированная объектная модель хранит весь XML-информационный файл.

Use Case # 6 - Совместимость с JPA

JPA является стандартом Java для Java настойчивостью. JPA имеет много концепций: составные клавиши, двунаправленные отношения, ленивую загрузку и т. Д., Которые могут быть трудными для использования с решением привязки XML. Например, любой инструмент XML, который взаимодействует только с объектами через поле, обычно имеет проблемы с ленивыми свойствами загрузки.

Номинанты:

Use Case # 7 - Совместимость с XML Web Services (JAX-WS)

JAXB является обязательным слой по умолчанию для JAX-WS.

Номинанты:

  • JAXB (реализация зависит от поставщика JAX-WS)

Use Case # 8 - Совместимость с RESTful Web Services (JAX-RS)

JAX-RS предлагает легкую альтернативу JAX-WS на основе протокола HTTP.Выполните следующие действия для example.

Номинанты:

  • JAXB (все реализации) - Уровень привязки по умолчанию и простой в использовании с JAX-RS.
  • Все остальное. Вы можете использовать концепции MessageBodyReader/Writer для использования других инструментов XML.

Use Case # 9 - Совместимость с Spring

Spring имеет ряд встроенных в поддержку интеграции с XML связывания инструментов, проверьте следующую ссылку для получения дополнительной информации:

Номинальные должности:

  • JAXB (все реализации)
  • Кастор
  • XMLBeans
  • JiBX

Другие вещи, чтобы рассмотреть

  • ли инструмент все еще разрабатывается/поддерживается? Как ни забавно, как это звучит, я видел, как люди рекомендуют инструменты, которые не были обновлены через 5 лет. Некоторые из упомянутых здесь инструментов не были выпущены через 2 года.

Мой выбор для BEST-подхода? - JAXB

Ознакомиться с вышеуказанными категориями, JAXB не всегда может быть наилучшим образом подходит для конкретного варианта использования (но он всегда подходит), но это единственная библиотека, которая может использоваться для всех видов использования случаев. Это означает, что он всегда может выполнять эту работу. Альтернативой является использование разных библиотек для разных задач, что позволяет поддерживать несколько библиотек.

Я действительно выполняю реализацию JAXB EclipseLink MOXy, но MOXy начал свою жизнь как собственная библиотека привязки XML TopLink OXM. TopLink всегда понимал преимущества стандартов (т. Е. EJB/JPA), и мы реализовали JAXB 1. Затем мы (я являюсь представителем) стали активными членами JAXB 2 (JSR-222).

+3

Блейз - лидер команды JAXB, поэтому, возможно, он не самый объективный взгляд. – duffymo

+0

Да, да. Ваш голос был необоснован. И быть лидером JAXB, безусловно, делает вас авторитетом в вашей технологии, но это не единственная альтернатива. XStream был бы столь же важен. Лично мне это нравится намного лучше твоего. – duffymo

+0

Это ваше мнение, и вы имеете на это право. ОП попросил другие подходы, и я дал один. – duffymo

10

Вы всегда можете сделать это с помощью интерфейсов javax.xml.bind.Marshaller и javax.xml.bind.Unmarshaller.

Это не так сумасшедший, как кажется. Это не так сложно сделать, и у вас будет полный контроль и знание того, что сделано.

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

Я использовал XStream в прошлом и мне понравилось, но когда я его использовал, мне не пришлось беспокоиться о пространствах имен XML. Мне говорят, что XStream не справляется с ними хорошо.

+1

Меньше зависимостей, больше контроля. Некоторые библиотеки, которые сериализуют Java на XML и обратно, не делают хороших вещей. Посмотрите, как они когда-нибудь обрабатывают коллекции и видят, что я имею в виду. Реализации Marshaller и Unmarshaller не так сложно писать, если у вас есть простые классы, которые не являются глубоко вложенными, и вам нужно только сделать это один раз. Я должен указать, что вы указаны как команда JAXB, поэтому, возможно, ваша предвзятость показывается, Блейз. – duffymo

+2

+1 чтобы противостоять бессмысленному понижению. –

+0

Спасибо, Стивен С. – duffymo

2

Некоторые варианты включают: -

Однако одно существенное преимущество идти с JAXB он поставляется с distrubtion Java.

+0

Посмотрите мои сравнения JAXB и XStream: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

0

Есть также:

  • java.beans.XMLEncoder/-Decoder
  • javax.xml.stream.XMLStreamWriter

Но я рекомендую использовать JAXB, если у вас нет уважительной причины, чтобы сделать иначе.

1

Я знаю, что это не то, что вы просили, но вы считали JSON вместо XML? В настоящее время я работаю над проектом, который сильно использует JSON (с библиотекой Jackson), и я очень доволен этим. Джексон работает аналогично JAXB - он даже работает с аннотациями JAXB, если вы хотите использовать оба.

XMLBeans также стоит посмотреть.

+0

+1 для Джексона - мне это очень нравится. Недавно начал использовать его. – duffymo

+0

Джексон только для JSON правильно, а не для XML, это правильно? – Rachel

+0

Правильно, Джексон переводит Java на JSON и обратно. Он не отвечает на вопрос сам по себе, но он ставит альтернативу использованию JSON на столе. Это будет намного меньше байтов, чем XML. – duffymo

0

Apache Digester является опцией. Для него это tutorial.Если формат JSON приемлем, вы можете использовать google-gson.

+0

Будет ли Apache Digester полезным для преобразования Java в XML, я просматривал документ и, похоже, он используется для XML-Java? Это верно ? – Rachel

+0

@Rachel: Да, он используется для преобразования объектов Java в xml. – Emil

+0

Я просматривал отзывы об Apache Digester, и кажется, что это не лучший подход, это правда или у вас есть какой-то другой опыт использования этого? – Rachel

1

Простой XML сериализация (simpleframework.org)

Другой подход Simple его гораздо проще в использовании, чем JAXB, JiBX или других подобных инструментов. Вы просто комментируете класс, и вы можете сериализовать любые POJO для XML. Кроме того, это, вероятно, единственная структура, которая в настоящее время работает на всех известных платформах Java, включая Android, Google App Engine, любой JDK 1.5+. Для получения дополнительной информации вы можете ознакомиться с Tutorial

+0

С JAXB вы также просто аннотируете свои классы, чтобы сериализовать любые POJO для XML. Объем работы аналогичен: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-simple.html. JAXB также намного проще использовать со стандартными веб-сервисами, такими как JAX-WS (SOAP) и JAX-RS (REST). –

+0

Его 5-минутная работа для интеграции с JAX-RS, я сомневаюсь, что JAXB будет проще использовать здесь. Также в JAXB отсутствуют такие функции, как инжектор конструктора, шаблоны и многие другие, а также поддержка Android. –

0

Castor позволяет создавать классы Java (достойные реализации) прямо из схемы XSD (пример использования № 1 выше). Просто убедитесь, что в Android 2.1 не использовать SAXParser по умолчанию. Вы получите ошибки пространства имен. Вы делаете это, определяя синтаксический анализатор, например, Xerces (и добавляете необходимые JARS) в core.properties. В android 2.2 это может быть нормально. Обратите внимание: если вы создадите xmlcontext для unmarsheler с помощью xerces, он все равно не будет работать, поскольку само сопоставление будет обрабатываться SAX от android. Это должно быть сделано в core (файл свойств верхнего уровня), так что даже сопоставление анализируется с помощью xerces. наконец, производительность работает так же медленно, как вы можете ожидать ... :(Удачи SM

Смежные вопросы