Объект Java в схему XML

Если у вас есть объект Java и схема XML (XSD), как лучше всего взять этот объект и преобразовать его в файл xml в соответствии со схемой. Объект и схема не знают друг о друге (в том смысле, что классы java не были созданы из схемы).

Например, в классе может быть целочисленное поле totalCountValue, которое соответствует элементу countTotal в файле xsd. Есть ли способ создать отображение, которое скажет: «Если объект содержит int totalCountValue, создайте элемент с именем 'countTotal' и поместите его в XML». Точно так же в объекте может быть поле, которое следует игнорировать, или список в объекте, который должен соответствовать нескольким элементам XML.

Я посмотрел на XStream, но не нашел (очевидного) способа сделать это. Существуют ли другие библиотеки XML, которые могут упростить эту задачу?

Для этой задачи существует гораздо больше сериализаторов: например, JiBX Подробнее см. Здесь: karussell.wordpress.com/2009/09/03/xml-serializers-for-java

Karussell 26.02.2010 16:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
9 325
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Я считаю, что этого можно достичь с помощью JAXB, используя его аннотации. Обычно мне было намного проще сгенерировать объекты из JAXB (как определено в вашей схеме) с помощью XJC, чем сопоставить существующий объект Java в соответствии с моей схемой. YMMV.

Я выполняю сериализацию Object do XML с помощью XStream. Что вы не находите "очевидным" в этом сериализаторе? Как только вы освоитесь, это будет очень просто.

В приведенном вами примере может быть что-то вроде этого:

...
XStream xstream = new XStream(new DomDriver());

xstream.alias("myclass", MyClass.class);
xstream.aliasField("countTotal", MyClass.class, "totalCountValue");

String xml = xstream.toXML(this);
...

для этого образца класса:

class MyClass {
     private int totalCountValue;

     public MyClass() {
     }
} 

Если вы найдете какой-нибудь сериализатор более простым или «крутым», чем этот, поделитесь им с нами. Я тоже ищу перемен ...

Ознакомьтесь с мини-учебником XStream здесь

Потому что тогда ваши аннотации Xstream должны поддерживаться в соответствии с XSD. Вы повторяете определения вашей схемы.

rshepherd 18.06.2010 21:57

Для этой работы я использую java-библиотеку JiBx. Вам необходимо написать файл сопоставления (в XML), чтобы описать, как вы хотите, чтобы элементы схемы XML отображались на объекты java. Есть несколько инструментов-генераторов, которые помогут автоматизировать процесс. Плюс это действительно быстро.

Вы можете использовать библиотеку из Apache Commons под названием Между. Он может отображать bean-компонент в XML, а затем обратно, если вам нужно пройти туда и обратно.

Взгляните на JDOM.

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

По общему признанию, мое тестирование не было полным для всех этих библиотек, но для цели, упомянутой в вопросе, я нашел Woodstox лучшим. Он самый быстрый для маршаллинга (в моем тестировании он превосходил XStream примерно на 30-40%). Он также довольно прост в использовании и управлении.

Недостатком этого подхода является то, что созданный XML (поскольку он определен мной) необходимо запустить через валидатор, чтобы убедиться, что он соответствует схеме.

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

Другие вопросы по теме