Если у вас есть объект Java и схема XML (XSD), как лучше всего взять этот объект и преобразовать его в файл xml в соответствии со схемой. Объект и схема не знают друг о друге (в том смысле, что классы java не были созданы из схемы).
Например, в классе может быть целочисленное поле totalCountValue, которое соответствует элементу countTotal в файле xsd. Есть ли способ создать отображение, которое скажет: «Если объект содержит int totalCountValue, создайте элемент с именем 'countTotal' и поместите его в XML». Точно так же в объекте может быть поле, которое следует игнорировать, или список в объекте, который должен соответствовать нескольким элементам XML.
Я посмотрел на XStream, но не нашел (очевидного) способа сделать это. Существуют ли другие библиотеки XML, которые могут упростить эту задачу?




Я считаю, что этого можно достичь с помощью 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. Вы повторяете определения вашей схемы.
Для этой работы я использую java-библиотеку JiBx. Вам необходимо написать файл сопоставления (в XML), чтобы описать, как вы хотите, чтобы элементы схемы XML отображались на объекты java. Есть несколько инструментов-генераторов, которые помогут автоматизировать процесс. Плюс это действительно быстро.
Вы можете использовать библиотеку из Apache Commons под названием Между. Он может отображать bean-компонент в XML, а затем обратно, если вам нужно пройти туда и обратно.
Взгляните на JDOM.
Я опробовал большинство предложенных библиотек, чтобы выбрать наиболее подходящую для моих нужд. Я также опробовал библиотеку, которая здесь не упоминалась, но была предложена моим коллегой, это была реализация StAX под названием Woodstox.
По общему признанию, мое тестирование не было полным для всех этих библиотек, но для цели, упомянутой в вопросе, я нашел Woodstox лучшим. Он самый быстрый для маршаллинга (в моем тестировании он превосходил XStream примерно на 30-40%). Он также довольно прост в использовании и управлении.
Недостатком этого подхода является то, что созданный XML (поскольку он определен мной) необходимо запустить через валидатор, чтобы убедиться, что он соответствует схеме.
Я бы сказал JAXB или Castor. Я обнаружил, что Castor проще и надежнее в использовании, но стандартным является JAXB.
Для этой задачи существует гораздо больше сериализаторов: например, JiBX Подробнее см. Здесь: karussell.wordpress.com/2009/09/03/xml-serializers-for-java