Статьи

Мул и JAXB: превращение XSD-файла в XML Fiesta!

Привет друзья! Как дела?

С тобой когда-нибудь случалось следующее? Однажды утром вы приходите на работу, и ваш начальник говорит вам: «Мне нужно, чтобы вы взяли эти данные и превратили их в XML ». Ну, это уже случилось со мной, и в этом блоге я собираюсь показать вам , как сделать это быстро.

XSD?

Честно говоря, моему начальнику он дал мне XSD-файл, описывающий структуру XML-файла, который меня попросили сгенерировать. Но что такое XSD-файл?

XSD расшифровывается как определение схемы XML. Это всего лишь другой XML-файл известного и канонического формата, который используется для описания структуры другого XML-файла. Например, если я хочу сбросить данные сотрудника в XML, задача XSD состоит в том, чтобы каждый знал, что у сотрудника должно быть имя, адрес, номер социального страхования, что он может занимать несколько должностей в одной организации и и так далее … Но самое главное, он описывает структуру всех этих данных в файле XML.

Вот пример XSD для вашей справки, описывающий XML сотрудников:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Customer" type="CustomerType" />
  <xsd:complexType name="CustomerType">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string" />
      <xsd:element name="address" type="xsd:string" />
      <xsd:element name="email" type="xsd:string" />
      <xsd:element maxOccurs="unbounded" name="InteractionResource" type="InteractionResourceType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="InteractionResourceType">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string" />
      <xsd:element name="feed" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Генерация объектов

Но кого это волнует? Какая польза от файла XSD? Ну, во-первых, ваша IDE, вероятно, использует XSD-файлы для проверки правильности написанных вами XML-файлов (это верно, например, при работе со Spring, Hibernate и, конечно, Mule ESB ). Но это также может быть использовано для автоматического отображения и генерации кода. Что JAXB делает, так это читает XSD-файл, чтобы автоматически генерировать набор классов, которые имитируют структуру XML и позволяют одинаково хранить те же данные. Как только эти классы существуют, JAXB легко может маршалировать данные XML в эти объекты и наоборот.

У JAXB есть терминальная команда, которая берет XSD-файл и превращает его в Java Bean. Эта команда называется XJC и присутствует в папке bin / любой установки JDK, начиная с версии 1.6. Вот пример того, как его использовать:

xjc example.xsd

Приведенная выше команда создаст класс Java с соответствующими аннотациями JAXB для выполнения маршалинга и демаршаллинга XML. Он также создаст второй класс с именем ObjectFactory, который он будет использовать внутри при выполнении преобразований. Вам нужно добавить эти классы в ваш проект. Для простоты предположим, что вы положили их в пакет com.mulesoft.example .

Тогда это всего лишь вопрос заполнения компонента и использования JAXB Transformers Mule для генерации XML. Пример кода выглядит следующим образом:

<!-- give jaxb a package to scan for annotations -->
<mulexml:jaxb-context name="myJaxB" packageNames="com.mulesoft.example" />
<sub-flow name="xmlMarshalling">
   
   <!-- sample transformer that would populate your bean -->
   <expression-transformer expression="new Employee(name:'John Doe', email:'john.doe@mulesoft.com')" evaluator="groovy" />

   <!-- Generate the XML -->
   <mulexml:jaxb-object-to-xml-transformer name="myMarshaller" jaxbContext-ref="myJaxB"/>
</sub-flow>

Вот и все. Ты только что сделал своего босса счастливым. Вы действительно хотите произвести на него впечатление? Давайте также посмотрим, как вы можете выполнить обратную операцию и преобразовать файл XML в объект Java.
Mule уже предоставляет готовый объект-преобразователь xml из коробки, и в этом случае он будет прекрасно работать, но просто для полноты картины давайте посмотрим, как можно сделать то же самое с помощью JAX.

<sub-flow name="unmarshall">
    <mulexml:jaxb-xml-to-object-transformer name="XmlToObject" jaxbContext-ref="myJaxb" returnClass="org.mule.jaxb.Example"/>
</sub-flow>

Вот и все! Вы все готово! Теперь покажи это своему боссу и заставь его купить тебе пива!

Нет похожих сообщений.