Генерация Java-классов от.XSD файлы...?
У меня есть гигантский QuickBooks SDK .Файл схемы XSD, который определяет XML-запросы/ответы, которые я могу отправлять / получать из QuickBooks.
Я хотел бы иметь возможность легко создавать классы Java из них .XSD-файлы, которые я мог бы затем использовать для маршалирования XML в объекты Java и объекты Java в XML.
есть ли простой способ сделать это...?
В идеале, это не потребует каких-либо библиотек, внешних для базового дистрибутива Java во время выполнения. Но я гибкий...
13 ответов:
JAXB делает именно то, что вы хотите. Он встроен в JRE / JDK, начиная с 1.6
чтобы расширить комментарии "use 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 минут, попробуйте простую XML-сериализацию. Не тратьте время на изучение API для использования JAXB 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 для повышения производительности. Тем не менее, то, что я часто хочу сделать, - это простое сопоставление между POJOs и XML. Однако создание классов Java для выполнения синтаксического анализа событий XML вручную не является тривиальным. Недавно я обнаружил, что JAXB является быстрым и удобным Java-XML сопоставление или сериализация.
JAXB содержит много полезных функций, вы можете проверить эталонную реализацию здесь. Kohsuke это также является хорошим ресурсом, чтобы узнать больше о JAXB. Для этой записи в блоге я покажу вам, как сделать простую сериализацию Java-XML с помощью JAXB.
POJO в XML
допустим, у меня есть объект Java элемента. Я хочу сериализовать объект Item в формате XML. Что я должен сделать в первую очередь это аннотируйте это POJO с помощью нескольких XML-аннотаций из javax.XML.связывать.аннотация.* пакет. См. код в листинге 1 для элемента.java
код
@XmlRootElement(name="Item")указывает, что я хочу быть корневым элементом.@XmlType(propOrder = {"name", "price"})указывает порядок, в котором я хочу, чтобы элемент был упорядочен в выводе XML.@XmlAttribute(name="id", ...)указывает, что id является атрибутом корневого элемента.@XmlElement(....)указывает, что я хочу, чтобы цена и имя были элемент внутри элемента.мой
Item.javaготово. Затем я могу продолжить и создать скрипт JAXB для маршалинга элемента.//creating Item data object Item item = new Item(); item.setId(2); item.setName("Foo"); item.setPrice(200); ..... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); //I want to save the output file to item.xml marshaller.marshal(item, new FileWriter("item.xml"));полный список кодов см. В списке кодов 2
main.java. Выходной код листинг 3item.xmlсоздается файл. Выглядит это так:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> <ns1:itemName>Foo</ns1:itemName> <ns1:price>200</ns1:price> </ns1:item>просто так? Вы можете альтернативно направить выходной XML как текстовую строку, поток, писатель, ContentHandler и т. д., просто изменив параметр Маршала(...) метод как
... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); // save xml output to the OutputStream instance marshaller.marshal(item, <java.io.OutputStream instance>); ... JAXBContext context = JAXBContext.newInstance(item.getClass()); Marshaller marshaller = context.createMarshaller(); StringWriter sw = new StringWriter(); //save to StringWriter, you can then call sw.toString() to get java.lang.String marshaller.marshal(item, sw);XML в POJO
Давайте изменим процесс. Предположим, что теперь у меня есть фрагмент данных строки XML, и я хочу превратить его в элемент.объект Java. XML-данные (код листинга 3) выглядят как
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item"> <ns1:itemName>Bar</ns1:itemName> <ns1:price>80</ns1:price> </ns1:item>затем я могу разобрать этот xml-код на объект Item с помощью
... ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes()); JAXBContext context = JAXBContext.newInstance(Item.getClass()); Unmarshaller unmarshaller = context.createUnmarshaller(); //note: setting schema to null will turn validator off unmarshaller.setSchema(null); Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes)); return xmlObject; ...для полный пример кода см. листинг 2 (Основная.ява.) Источник XML может поступать во многих формах как из потока, так и из файла. Единственный разница, опять же, является параметром метода:
... unmarshaller.unmarshal(new File("Item.xml")); // reading from file ... // inputStream is an instance of java.io.InputStream, reading from stream unmarshaller.unmarshal(inputStream);проверка с помощью XML-схемы
последнее, что я хочу упомянуть здесь, - это проверка входного XML со схемой перед отключением объекта Java. Я создаю XML-файл схемы с именем item.XSD-файл. Полный список кодов см. В списке кодов 4 (пункт.XSD-файл.) Теперь мне нужно зарегистрировать эту схему для проверки.
... Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) .newSchema(new File("Item.xsd")); unmarshaller.setSchema(schema); //register item.xsd shcema for validation ...когда я пытаюсь разобрать XML-данные в POJO, если вход XML не соответствует схеме, исключение будет поймано. Полный список кодов см. В листинге кода 5 (invalid_item.XML.)
javax.xml.bind.UnmarshalException - with linked exception: javax.xml.bind.JAXBException caught: null [org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is not a valid value for 'integer'.]здесь я изменить идентификатор атрибута в строку, а не целое число.
если входные данные XML действительны для схемы, XML-данные будут неупорядочены в элемент.объект java успешно.
использование Eclipse IDE: -
- скопируйте xsd в новый/существующий проект.
- убедитесь, что у вас есть JAXB необходимые банки в вас classpath. Вы можете скачать один здесь.
- щелкните правой кнопкой мыши на файле XSD - > создать - > классы JAXB.
XMLBeans сделаем это. В частности, команда "scomp".
EDIT: XMLBeans был пенсии, Регистрация это сообщение stackoverflow для получения дополнительной информации.
Maven может быть использован для этой цели, вам нужно добавить некоторые зависимости и просто очистить ваше приложение. Вы получите все классы, созданные автоматически в нужную папку.
просто скопируйте их из цели в нужное место, вот pom.xml, который я использовал для создания класса из xsd-файлов:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>src/main/webapp/schemas/</schemaDirectory> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>просто поместите свои xsd-файлы в " src/main/webapp/ schemas/", и maven найдет их во время компиляции.
надеюсь, что это поможет вам, больше информации можно найти по адресу http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
надеюсь, что это поможет :)
самый простой способ-это использование командной строки. Просто введите в каталог вашего .xsd-файл:
xjc myFile.xsd.Итак, java будет генерировать все Pojos.
Ну лучший вариант-это
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd.У меня тоже есть вопрос, если у нас есть возможность сделать обратного инжиниринга. если да, то можем ли мы генерировать xsd из класса pojo?
Если вы не возражаете использовать внешнюю библиотеку, я использовал Castor чтобы сделать это в прошлом.
ограничение JAXB.
Я работал над JAXB, по моему мнению, это хороший способ работы с данными между объектами XML и Java. Положительными сторонами являются его проверенная и лучшая производительность и контроль над данными во время выполнения. При хорошем использовании встроенных инструментов или скриптов это отнимет много усилий по кодированию.
Я обнаружил, что часть конфигурации-это не сразу задача, и потратил часы на настройку среды разработки.
Я отказался от этого решения из-за глупого ограничения, с которым я столкнулся. Мое определение схемы XML (XSD ) имеет атрибут/элемент с именем "value" и что я должен использовать XSD как есть. Это очень небольшое ограничение заставило мой шаг привязки XJC не удалось с ошибкой "свойство' значение ' уже используется."Это связано с реализацией JAXB, процесс привязки пытается создать объекты Java из XSD, добавив несколько атрибутов к каждому классу, и один из них является атрибутом value. При обработке мой XSD он жаловался, что уже есть свойство с этим именем.
разве XJC JAXB не является возможным ответом на это? Я пытаюсь добиться того же самого. Все еще в" пробной " фазе, хотя. Наткнулся на XJC, поэтому подумал о совместном использовании.
известный JAXB
есть плагин maven что может сделать это для вас на любом этапе сборки вы хотите.
вы могли бы сделать это в обоих направлениях: xsd Java
говоря об ограничении JAXB, решение при наличии одного и того же имени для разных атрибутов добавляет встроенные настройки jaxb в xsd:
+
. . обязательные декларации . .
или внешних настроек...
вы можете увидеть более подробную информацию дальше : http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
Comments