jaxb xsd生成xml
(注意:对原始帖子进行了少量编辑以提高可读性)
我们可以使用JAXB使用给定的Schema将Java对象编组为XML,反之亦然。 可以以DTD , XSD或其他格式指定XML模式。
工具“ xjc”可用于从XSD架构生成带注释的Java类。 可以下载Java Web服务开发人员包(WSDP) ,其中包括所需的JAXB实现工具。 在这里,我将阐明如何动态生成XML。
使用的样本XSD是:
– Expense.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="expenseReport" type="ExpenseT" />
<xs:complexType name="ExpenseT"><xs:sequence><xs:element name="user" type="UserT"/><xs:element name="items" type="ItemListT"/></xs:sequence>
</xs:complexType>
<xs:complexType name="UserT"><xs:sequence><xs:element name="userName" type="xs:string" /></xs:sequence>
</xs:complexType>
<xs:complexType name="ItemListT"><xs:sequence><xs:element name="item" type="ItemT" maxOccurs="unbounded"/></xs:sequence>
</xs:complexType>
<xs:complexType name="ItemT"><xs:sequence><xs:element name="itemName" type="xs:string" /><xs:element name="purchasedOn" type="xs:string" /><xs:element name="amount" type="xs:decimal" /></xs:sequence>
</xs:complexType>
</xs:schema>
现在,我们使用xjc工具生成相应的Java类。 对生成的Java类进行适当的注释。 我不会详细介绍类的注释,因为这会使事情变得复杂。
xjc.exe费用.xsd
默认情况下,该命令在名为“ generated”的目录中生成Java类。 xjc可以使用很多选项,并且可以看看使用
xjc-帮助
下面的Main类使用生成的类来创建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");JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);Marshaller marshaller = context.createMarshaller();marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);marshaller.marshal(element,System.out);}}
在上面的XSD中,我们看到很少声明复杂类型。 这些复杂的类型会生成Java类。 子元素和属性成为该类的属性,并且为它们提供了getter和setter。 不能直接创建此类的实例,即不能对其进行调用。 每当我们编译XSD时,都会生成一个ObjectFactory类-这是用于创建XSD Complex类型的实例的工厂(上述Java类的Lines-17,19,24,27)。
一旦获得实例,便使用该类提供的设置器将相应的数据填充到属性中。 还要注意,复杂元素可以具有许多复杂元素作为类的成员。 在那种情况下,我们使用工厂获取复杂元素的实例,然后使用外部复杂元素的setter。
例如:在上面的XSD中,ExpenseT是一个复杂类型,它由UserT和ItemT列表(ItemListT)组成。 在上面的Java类(第27、28、29行)中,我们正在创建ExpenseT的实例,然后使用设置器设置UserT和ItemListT的值。 通过为工厂调用createExpenseReport()创建RootElement。 方法的名称受根元素名称的影响,并且方法的返回类型和参数类型与根元素的类型相同。
一旦我们为XML中的不同元素(属性)设置了值,现在就可以实际生成XML。 我们必须有一个Marshaller (从Java对象获取XML)或一个Unmarshaller (从XML对象获取Java)。
我们需要一个Marshaller –可以从JAXBContext实例获得。 第31,32行获取Marshaller的实例。 可以为marshaller设置不同的属性,在上面的代码中,我们将jaxb.formatted.output设置为true,这意味着所获得的XML格式正确,使用户可读。
支持的不同属性是:
- jaxb.encoding
- jaxb.formatted.output
- jaxb.schema位置
- jaxb.noNamespaceSchemaLocation
- jaxb.fragment
<instance_of_marshaller> .marshal()是用于生成XML的方法。 它被重载以接受以下输出机制:
- 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
生成的XML如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><expenseReport><user><userName>Sanaulla</userName></user><items><item><itemName>Seagate External HDD</itemName><purchasedOn>August 24, 2010</purchasedOn><amount>6776.5</amount></item></items>
</expenseReport>
相关文章:
- 带有简单框架教程的Android XML绑定
- 使用XML Pull增强Android XML解析
- 具有Spring和Maven教程的JAX–WS
- Spring 3 RESTful Web服务
翻译自: https://www.javacodegeeks.com/2011/02/jaxb-generate-xml-xsd.html
jaxb xsd生成xml