Генерация Java-классов от.XSD файлы...?



У меня есть гигантский QuickBooks SDK .Файл схемы XSD, который определяет XML-запросы/ответы, которые я могу отправлять / получать из QuickBooks.



Я хотел бы иметь возможность легко создавать классы Java из них .XSD-файлы, которые я мог бы затем использовать для маршалирования XML в объекты Java и объекты Java в XML.



есть ли простой способ сделать это...?



В идеале, это не потребует каких-либо библиотек, внешних для базового дистрибутива Java во время выполнения. Но я гибкий...

1076   13  

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. Выходной код листинг 3 item.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: -

  1. скопируйте xsd в новый/существующий проект.
  2. убедитесь, что у вас есть JAXB необходимые банки в вас classpath. Вы можете скачать один здесь.
  3. щелкните правой кнопкой мыши на файле 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

    Ничего не найдено.