Creating xml from xsd java

Using JAXB to generate XML from the Java, XSD

We can use JAXB to marshal the Java objects into XML using the given Schema and vice versa- unmarshal XML into Java objects. The xml schema can be specified in DTD, XSD or other format. The tool “xjc” is used to generate the annotated Java classes from the XSD schema. One can download the Java WSDP from here, it includes the JAXB implementation tools required. Here I will throw light on how to generate XML dynamically. Even I havent gone in depth with JAXB, but I found this really useful and thought of sharing it in the blog.

The sample XSD being used is: expense.xsd

Now we use the xjc tool to generate corresponding Java classes. The generate java classes are annotated appropriately. Am not going into the annotation of the classes, cause it would make things complicated.

By default the command generates the Java classes in a directory named “generated”. There are lot of options which can be used with xjc and one can have a look at using- xjc -help.

The below Main class- Main.java uses the generated classes for creating the XML.

package generated; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.math.BigDecimal; public class Main < public static void main(String[] args) throws JAXBException < ObjectFactory factory = new ObjectFactory(); UserT user = factory.createUserT(); user.setUserName("Sanaulla"); ItemT item = factory.createItemT(); item.setItemName("Seagate External HDD"); item.setPurchasedOn("August 24, 2010"); item.setAmount(new BigDecimal("6776.5")); ItemListT itemList = factory.createItemListT(); itemList.getItem().add(item); ExpenseT expense = factory.createExpenseT(); expense.setUser(user); expense.setItems(itemList); JAXBContext context = JAXBContext.newInstance("generated"); JAXBElementelement = factory.createExpenseReport(expense); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE); marshaller.marshal(element,System.out); > >

In the above XSD, we see that there are few complex types declared. These complex types generate in to Java classes. The child elements and attributes become the properties of the class and they are provided with the getters and setters. One cannot directly create the instance of such classes i.e cannot call new on them. When ever we compile a XSD, there is a ObjectFacotry class generated- this is the factory for creating the instances of the XSD Complex types (Lines-17,19, 24, 27 in the above Java class). Once we get the instance we populate the properties with corresponding data using the setters provided with the class. Also note that- A complex element can have many complex elements as the members of the class. In that case what happens we use the factory to get the instance of the complex elements and then use the setters of the outer complex element. For example: In the above XSD- ExpenseT is a complex type which consists of UserT and a list of ItemT (ItemListT). In the above Java class- Lines-27,28,29- am creating an instance of ExpenseT and then using the setters to set the values of the UserT and ItemListT. The RootElement- is created by calling createExpenseReport() for the factory. The name of the method is influenced by the name of the root element and the return type and the argument type of the method is same as that of the type of root element.

Читайте также:  Генерация jwt токена php

Once we have set the values for the different elements, attributes which are to go into the XML, its now time to actually generate the XML. We must have an Marshaller (To get XML from the Java objects) or an Unmarshaller (to get java objects from XML). We would need a Marshaller- which can be obtained from the JAXBContext instance. Lines- 31,32 obtain an instance of Marshaller. Different properties can be set for the marshaller and in the above code we are setting the jaxb.formatted.output as true- which means that the xml obtained is neatly formatted making is readable to the user.

Different properties supported are:

  • jaxb.encoding
  • jaxb.formatted.output
  • jaxb.schemaLocation
  • jaxb.noNamespaceSchemaLocation
  • jaxb.fragment

.marshal() is the method used to generate the XML. Its is overloaded to accept the following output mechanisms:

  • org.xml.sax.ContentHandler
  • org.w3c.dom.Node
  • javax.xml.transform.Result
  • java.io.Writer
  • java.io.OutputStream
  • javax.xml.stream.XMLStreamWriter
  • javax.xml.stream.XMLEventWriter

The xml generated is shown below:

   Sanaulla   Seagate External HDD August 24, 2010 6776.5    

PS: I havent gone much into the details of JAXB. This is just the overview of how one can generate XML confirming to the schema.

Источник

Using JAXB to generate XML from XSD

This is a post originally published by Mohamed Sanaulla from Experiences Unlimited, our latest JCG partner. Mohamed explains how to use JAXB to generate XML from a given XSD. (NOTE: The original post has been slightly edited to improve readability) We can use JAXB to marshal the Java objects into XML using the given Schema and vice versa- unmarshal XML into Java objects. The XML schema can be specified in DTD, XSD or other format. The tool “xjc” can be used to generate the annotated Java classes from the XSD schema. One can download the Java Web Services Developer Pack (WSDP), it includes the JAXB implementation tools required. Here I will throw light on how to generate XML dynamically. The sample XSD being used is: – expense.xsd

Now we use the xjc tool to generate the corresponding Java classes. The generated Java classes are annotated appropriately. I am not going into details about the annotation of the classes, cause it would make things complicated.

xjc.exe expense.xsd By default the command generates the Java classes in a directory named “generated”. There are lot of options which can be used with xjc and one can have a look at using xjc -help The below Main class uses the generated classes for creating the XML. – Main.java

package generated; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.math.BigDecimal; public class Main < public static void main(String[] args) throws JAXBException < ObjectFactory factory = new ObjectFactory(); UserT user = factory.createUserT(); user.setUserName("Sanaulla"); ItemT item = factory.createItemT(); item.setItemName("Seagate External HDD"); item.setPurchasedOn("August 24, 2010"); item.setAmount(new BigDecimal("6776.5")); ItemListT itemList = factory.createItemListT(); itemList.getItem().add(item); ExpenseT expense = factory.createExpenseT(); expense.setUser(user); expense.setItems(itemList); JAXBContext context = JAXBContext.newInstance("generated"); JAXBElementelement = factory.createExpenseReport(expense); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE); marshaller.marshal(element,System.out); > >
  • jaxb.encoding
  • jaxb.formatted.output
  • jaxb.schemaLocation
  • jaxb.noNamespaceSchemaLocation
  • jaxb.fragment

The generated XML is shown below:

   Sanaulla   Seagate External HDD August 24, 2010 6776.5    

Источник

Использование JAXB для генерации XML из XSD

Мы можем использовать JAXB для преобразования объектов Java в XML с использованием заданной схемы и, наоборот, для преобразования XML в объекты Java. Схема XML может быть указана в DTD , XSD или другом формате.

Инструмент «xjc» можно использовать для генерации аннотированных классов Java из схемы XSD. Можно загрузить пакет разработчика веб-служб Java (WSDP) , в него входят необходимые инструменты реализации JAXB. Здесь я расскажу, как динамически генерировать XML.

Теперь мы используем инструмент xjc для генерации соответствующих классов Java. Сгенерированные Java-классы соответствующим образом аннотированы. Я не буду вдаваться в подробности аннотации классов, потому что это усложнит ситуацию.

По умолчанию команда генерирует классы Java в каталоге с именем «генерируется». Есть много опций, которые можно использовать с xjc, и можно взглянуть на использование

Класс Main ниже использует сгенерированные классы для создания XML.

В приведенном выше XSD мы видим, что объявлено несколько сложных типов. Эти сложные типы генерируются в классах Java. Дочерние элементы и атрибуты становятся свойствами класса, и им предоставляются методы получения и установки. Нельзя напрямую создать экземпляр таких классов, то есть нельзя вызывать для них новые. Всякий раз, когда мы компилируем XSD, генерируется класс ObjectFactory — это фабрика для создания экземпляров сложных типов XSD (строки 17, 19, 24, 27 в приведенном выше классе Java).

Получив экземпляр, мы заполняем свойства соответствующими данными, используя установщики, предоставляемые классом. Также обратите внимание, что сложный элемент может иметь много сложных элементов в качестве членов класса. В этом случае мы используем фабрику, чтобы получить экземпляр сложных элементов, а затем используем установщики внешнего сложного элемента.

Например: в приведенном выше XSD ExpenseT является сложным типом, который состоит из UserT и списка ItemT (ItemListT). В приведенном выше Java-классе (строки 27, 28, 29) мы создаем экземпляр ExpenseT, а затем используем установщики для установки значений UserT и ItemListT. RootElement создается путем вызова createExpenseReport () для фабрики. На имя метода влияют имя корневого элемента и тип возвращаемого значения, а также тип аргумента метода такой же, как и у типа корневого элемента.

После того, как мы установили значения для различных элементов, атрибутов, которые должны входить в XML, пришло время фактически генерировать XML. У нас должен быть Marshaller (для получения XML из объектов Java) или Unmarshaller (для получения объектов Java из XML).

Нам нужен маршаллер, который можно получить из экземпляра JAXBContext . Строки 31,32 получают экземпляр Marshaller. Для маршаллера могут быть установлены разные свойства, и в приведенном выше коде мы устанавливаем jaxb.formatted.output как true, что означает, что полученный XML-файл аккуратно отформатирован, что делает его читаемым для пользователя.

Различные поддерживаемые свойства:

  • jaxb.encoding
  • jaxb.formatted.output
  • jaxb.schemaLocation
  • jaxb.noNamespaceSchemaLocation
  • jaxb.fragment

.marshal () — это метод, используемый для генерации XML. Его перегружают, чтобы принять следующие механизмы вывода:

Сгенерированный XML показан ниже:

Источник

Использование JAXB для генерации XML из XSD

Мы можем использовать JAXB для преобразования объектов Java в XML с использованием заданной схемы и, наоборот, для преобразования XML в объекты Java. Схема XML может быть указана в DTD , XSD или другом формате.

Инструмент «xjc» можно использовать для генерации аннотированных классов Java из схемы XSD. Можно загрузить пакет разработчика веб-служб Java (WSDP) , в него входят необходимые инструменты реализации JAXB. Здесь я расскажу, как динамически генерировать XML.

Теперь мы используем инструмент xjc для генерации соответствующих классов Java. Сгенерированные Java-классы соответствующим образом аннотированы. Я не буду вдаваться в подробности аннотации классов, потому что это усложнит ситуацию.

По умолчанию команда генерирует классы Java в каталоге с именем «генерируется». Есть много опций, которые можно использовать с xjc, и можно взглянуть на использование

Класс Main ниже использует сгенерированные классы для создания XML.

В приведенном выше XSD мы видим, что объявлено несколько сложных типов. Эти сложные типы генерируются в классах Java. Дочерние элементы и атрибуты становятся свойствами класса, и им предоставляются методы получения и установки. Нельзя напрямую создать экземпляр таких классов, то есть нельзя вызывать для них новые. Всякий раз, когда мы компилируем XSD, генерируется класс ObjectFactory — это фабрика для создания экземпляров сложных типов XSD (строки 17, 19, 24, 27 в приведенном выше классе Java).

Получив экземпляр, мы заполняем свойства соответствующими данными, используя установщики, предоставляемые классом. Также обратите внимание, что сложный элемент может иметь много сложных элементов в качестве членов класса. В этом случае мы используем фабрику, чтобы получить экземпляр сложных элементов, а затем используем установщики внешнего сложного элемента.

Например: в приведенном выше XSD ExpenseT является сложным типом, который состоит из UserT и списка ItemT (ItemListT). В приведенном выше Java-классе (строки 27, 28, 29) мы создаем экземпляр ExpenseT, а затем используем установщики для установки значений UserT и ItemListT. RootElement создается путем вызова createExpenseReport () для фабрики. На имя метода влияют имя корневого элемента и тип возвращаемого значения, а также тип аргумента метода такой же, как и у типа корневого элемента.

После того, как мы установили значения для различных элементов, атрибутов, которые должны входить в XML, пришло время фактически генерировать XML. У нас должен быть Marshaller (для получения XML из объектов Java) или Unmarshaller (для получения объектов Java из XML).

Нам нужен маршаллер, который можно получить из экземпляра JAXBContext . Строки 31,32 получают экземпляр Marshaller. Для маршаллера могут быть установлены разные свойства, и в приведенном выше коде мы устанавливаем jaxb.formatted.output как true, что означает, что полученный XML-файл аккуратно отформатирован, что делает его читаемым для пользователя.

Различные поддерживаемые свойства:

  • jaxb.encoding
  • jaxb.formatted.output
  • jaxb.schemaLocation
  • jaxb.noNamespaceSchemaLocation
  • jaxb.fragment

.marshal () — это метод, используемый для генерации XML. Его перегружают, чтобы принять следующие механизмы вывода:

Сгенерированный XML показан ниже:

Источник

Оцените статью