Каков наилучший способ преобразования java-объекта в xml с открытым исходным кодом apis
Мне было интересно, что лучший или наиболее широко используемый apis - преобразовать java-объект в xml. Я новичок в этом вопросе. Есть ли какой-то вызов api, который вы можете сделать, чтобы передать объект и вернуть xml? Или это гораздо более утомительно, когда вам нужно создать документ вручную, вытащив значения объекта?
Я читал о xerces, sax и jaxb. Я хотел бы продолжить этот маршрут с открытым исходным кодом.
Спасибо!
Ответы
Ответ 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 -нотации.
Ответ 2
Вы можете посмотреть на XStream: http://x-stream.github.io
Ответ 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)
Ответ 4
Как насчет java.beans.XMLEncoder и java.beans.XMLDecoder?
Пример http://www.rgagnon.com/javadetails/java-0470.html
Bye.
Ответ 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, например.