У меня есть гигантский файл схемы .XSD QuickBooks SDK, который определяет XML-запросы / ответы, которые я могу отправлять / получать из QuickBooks.
Я хотел бы иметь возможность легко генерировать классы Java из этих файлов .XSD, которые затем можно было бы использовать для маршалинга XML в объекты Java и объектов Java в XML.
Есть простой способ сделать это...?
В идеале во время выполнения не требуется никаких библиотек, внешних по отношению к базовому дистрибутиву Java. Но я гибкий ...
Ответы:
JAXB делает ТОЧНО то, что вы хотите. Он встроен в JRE / JDK, начиная с версии 1.6.
источник
Чтобы расширить комментарии "использовать JAXB" выше,
В Windows
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
например,
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Подождите немного, и если у вас есть хорошо сформированный файл XSD, вы получите несколько хорошо сформированных классов Java.
источник
Если вы хотите начать кодирование Java в XML и XML в Java менее чем за 5 минут, попробуйте Simple XML Serialization. Не тратьте часы на изучение JAXB API http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Однако, если вы действительно заинтересованы в изучении JAXB, вот отличный учебник. http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Содержание учебника:
JAXB для простой сериализации Java-XML
Существует несколько способов сериализации XML в Java. Если вам нужен детальный контроль над синтаксическим анализом и сериализацией, вы можете выбрать SAX, DOM или Stax для повышения производительности. Тем не менее, то, что я часто хочу сделать, - это простое отображение между POJO и XML. Однако создание классов Java для ручного анализа XML-событий нетривиально. Недавно я обнаружил, что JAXB - это быстрое и удобное отображение или сериализация Java-XML.
JAXB содержит множество полезных функций, вы можете ознакомиться с эталонной реализацией здесь. Блог Kohsuke также является хорошим ресурсом, чтобы узнать больше о JAXB. В этой записи блога я покажу вам, как выполнить простую сериализацию Java-XML с помощью JAXB.
POJO в XML
Допустим, у меня есть объект Java Item. Я хочу сериализовать объект Item в формат XML. Сначала мне нужно аннотировать этот объект POJO с помощью нескольких XML-аннотаций из пакета javax.xml.bind.annotation. *. См. Листинг кода 1 для Item.java
Из кода
@XmlRootElement(name="Item")
указывает, что я хочу быть корневым элементом.@XmlType(propOrder = {"name", "price"})
указывает порядок, в котором я хочу, чтобы элемент был упорядочен в выводе XML.@XmlAttribute(name="id", ...)
указывает, что id является атрибутом корневого элемента.@XmlElement(....)
указывает, что я хочу, чтобы цена и имя были элементами внутри Item.Моя
Item.java
готова. Затем я могу продолжить и создать сценарий JAXB для маршалинга Item.Полный листинг кода см. В листинге 2
main.java
. Будетitem.xml
создан выходной файл листинга 3 . Выглядит это так:Легко, правда? В качестве альтернативы вы можете направить выходной XML как текстовую строку, поток, Writer, ContentHandler и т.д., просто изменив параметр метода marshal (...), например
XML в POJO
Давайте обратим процесс. Предположим, что теперь у меня есть фрагмент строковых данных XML, и я хочу превратить его в объект Item.java. Данные XML (листинг кода 3) выглядят так:
Затем я могу демаршалировать этот xml-код в объект Item с помощью
Полный листинг кода см. В листинге 2 (main.java). Источник XML может иметь множество форм как из потока, так и из файла. Единственное отличие, опять же, это параметр метода:
Проверка с помощью схемы XML
Последнее, что я хочу здесь упомянуть, это проверка входящего XML с помощью схемы перед демаршалингом в объект Java. Я создаю файл схемы XML с именем item.xsd. Полный листинг кода см. В листинге 4 (Item.xsd). Теперь мне нужно зарегистрировать эту схему для проверки.
Когда я пытаюсь демаршалировать данные XML в POJO, если входной XML не соответствует схеме, будет обнаружено исключение. Полный листинг кода см. В листинге 5 (invalid_item.xml).
Здесь я меняю атрибут id на строку вместо целого числа.
Если ввод XML действителен для схемы, данные XML будут успешно немаршалированы в объект Item.java.
источник
Использование Eclipse IDE: -
источник
Самый простой способ - использовать командную строку. Просто введите каталог вашего .xsd файла:
Итак, java сгенерирует все Pojos.
источник
Для этой цели можно использовать Maven, вам нужно добавить некоторые зависимости и просто очистить ваше приложение. Вы получите все классы, созданные автоматически в вашей целевой папке.
Просто скопируйте их из цели в желаемое место, вот pom.xml, который я использовал для создания классов из файлов xsd:
Просто поместите свои файлы xsd в папку «src / main / webapp / schemas /», и maven найдет их во время компиляции.
Надеюсь, это поможет вам, дополнительную информацию можно найти на http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Надеюсь, это поможет :)
источник
No XSD files found. Please check your plugin configuration.
XMLBeans сделает это. В частности, команда "scomp".
EDIT: XMLBeans был отставной , проверить эту StackOverflow должность для получения дополнительной информации.
источник
Вполне лучший вариант
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.У меня также есть вопрос, есть ли у нас возможность провести здесь реверс-инжиниринг. если да, можем ли мы сгенерировать xsd из класса pojo?
источник
Если вы не против использования внешней библиотеки, я использовал Castor для этого в прошлом.
источник
Ограничение JAXB.
Я работал над JAXB, на мой взгляд, это хороший способ работы с данными между объектами XML и Java. Положительные стороны - это проверенная и лучшая производительность и контроль над данными во время выполнения. При правильном использовании встроенных инструментов или скриптов это избавляет от множества усилий по написанию кода.
Я обнаружил, что часть настройки - это не сразу задача, и потратил часы на настройку среды разработки.
Однако я отказался от этого решения из-за глупого ограничения, с которым столкнулся. В моем определении схемы XML (XSD) есть атрибут / элемент с именем «значение», и я должен использовать XSD как есть. Это очень маленькое ограничение вынудило мой шаг привязки XJC завершиться с ошибкой «Значение свойства уже использовано».
Это связано с реализацией JAXB, процесс привязки пытается создать объекты Java из XSD, добавляя несколько атрибутов к каждому классу, и один из них является атрибутом значения. Когда он обработал мой XSD, он пожаловался, что уже существует свойство с таким именем.
источник
Разве XJC от JAXB не является возможным ответом на это? Я пытаюсь добиться того же. Тем не менее, он все еще находится в стадии «попытки». Наткнулся на XJC, поэтому подумал поделиться.
источник
Хорошо известный JAXB
Есть плагин maven который может сделать это за вас на любом этапе сборки, который вы хотите.
Вы можете сделать это обоими способами: xsd <-> Java
источник
Говоря об ограничении JAXB, решением при наличии одного и того же имени для разных атрибутов является добавление встроенных настроек jaxb в xsd:
+
, , обязательные декларации. ,
или внешние настройки ...
Вы можете увидеть дополнительную информацию по адресу : http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
источник