使用JAXB从XSD生成XML

本文详细介绍了如何使用JAXB工具xjc从XSD文件生成Java类,并通过这些类动态创建XML。首先,xjc从XSD生成带注释的Java类,接着在Main.java中创建并填充实例,最后利用Marshaller将Java对象转换为格式化的XML输出。
这是最初由JCG合作伙伴 Experiences UnlimitedMohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML

(注意:对原始帖子进行了少量编辑以提高可读性)

我们可以使用JAXB使用给定的Schema将Java对象编组为XML,反之亦然。 可以以DTDXSD或其他格式指定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片段

<instance_of_marshaller> .marshal()是用于生成XML的方法。 它被重载以接受以下输出机制:

生成的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>

相关文章:


翻译自: https://www.javacodegeeks.com/2011/02/jaxb-generate-xml-xsd.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值