Подтвердить что ты не робот

Каков наилучший способ преобразования java-объекта в xml с открытым исходным кодом apis

Мне было интересно, что лучший или наиболее широко используемый apis - преобразовать java-объект в xml. Я новичок в этом вопросе. Есть ли какой-то вызов api, который вы можете сделать, чтобы передать объект и вернуть xml? Или это гораздо более утомительно, когда вам нужно создать документ вручную, вытащив значения объекта?

Я читал о xerces, sax и jaxb. Я хотел бы продолжить этот маршрут с открытым исходным кодом.

Спасибо!

4b9b3361

Ответ 1

JAXB определенно решение.

Почему? Ну, это внутри JDK 6, поэтому вы никогда не найдете его без изменений.

Он использует аннотации Java для объявления свойств, связанных с XML, для классов, методов и полей.

Учебное пособие 1

Учебное пособие 2

Примечание. JAXB также позволяет легко "размотать" XML-данные (который ранее был обработан экземплярами объектов Java) назад для экземпляров объектов.

Еще одна замечательная вещь в JAXB: она поддерживается другими связанными с Java технологий, таких как JAX-RS (API Java RESTful, который доступен как часть Java EE 6). JAX-RS может обслуживать и получать JAXB объекты на лету, без необходимости их сортировки/развязывания. Возможно, вы захотите проверить Netbeans, который содержит готовая поддержка JAX-RS. Прочтите этот учебник для начала.

изменить

Чтобы marshall/unmarshall "случайные" (или чужие) объекты Java, JAXB предлагает довольно простую возможность: можно объявить XmlAdapter и 'wrap' существующих классов Java для JAXB-совместимых. Использование такого XmlAdapter выполняется с помощью @XmlJavaTypeAdapter -нотации.

Ответ 3

Доступно с Java 6 - это API для преобразования аннотированных объектов Java в XML. Следующий код показывает, как преобразовать аннотированный объект в строку XML

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type());

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();

// Do this if you want the result to be more human readable.
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(o, System.out);

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

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type());

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();
final Schema schema = SchemaFactory.newInstance(
  "http://www.w3.org/2001/XMLSchema").newSchema(
  getClass().getResource("/META-INF/wsdl/schema.xsd"));
m.setSchema(schema);
m.marshal(o, System.out);

Вам не нужно преобразовывать тип в JAXBElement, если Type является определенным элементом. (то есть имеет аннотацию @XmlRootElement)

Ответ 5

Для тех, кто решает использовать JAXB, убедитесь, что вы кешируете JAXBContext. Известно, что JAXBContext.newInstance очень дорог. Я зарегистрировал случай, когда преобразование в xml используется при ведении журнала, а JAXBContext.newInstance не кэшируется, это привело к снижению производительности на 5 секунд после вызова 20 одновременных пользователей.

http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

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

Ответ 6

XMLBeans - еще один, похожий на JAXB. Я не смотрел на JAXB в то время, когда я это делал, это было довольно плохо по сравнению с XMLBeans, но это было много лет назад (и я предпочитаю использовать вещи, которые есть в JDK, а не сторонние, но я все еще использую XMLBeans и по сей день).

Ответ 7

В этом пространстве много фреймворков с открытым исходным кодом. Однако Simple, как следует из его названия, на сегодняшний день является самым простым способом выполнения сериализации. Взгляните на Tutorial. Другая особенность заключается в том, что он может выполнять полиморфную сериализацию, что означает, что она не ограничена, как JAXB, например.