(注意:對原始帖子進行了少量編輯以提高可讀性)
我們可以使用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片段
<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
- Spring3 RESTful Web服務
翻譯自: https://www.javacodegeeks.com/2011/02/jaxb-generate-xml-xsd.html