使用JAXB從XSD生成XML

這是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla發表的帖子。 Mohamed解釋了如何使用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片段

<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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374544.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tkinter 菜單添加事件_Tasker的最新測試劫持了Android 11的電源菜單

流行的Android自動化應用Tasker 最近收到了重大更新&#xff0c;為該應用引入了許多新功能。該更新包括解鎖應用程序讀取手機上任何傳感器以觸發任務的功能&#xff0c;使您可以通過任何第三方應用程序自動發送短信或撥打電話的功能&#xff0c;完全請勿打擾自定義功能。通過鏈…

CLR via C#(18)——Enum

1. Enum定義 枚舉類型是經常用的一種“名稱/值”的形式&#xff0c;例如&#xff1a; public enum FeedbackStatus { New, Processing, Verify, Closed } 定義枚舉類型之后我們在使用時方便了許多&#xff0c;不用再記著0代表什么狀態…

PHP中 magic_quotes_gpc 和 magic_quotes_runtime 區別及其反斜線轉義問題

php中關于反斜線轉義&#xff1a;php中數據的魔法引用函數 magic_quotes_gpc 或 magic_quotes_runtime 設置為on時&#xff0c;當數據遇到 單引號 和 雙引號" 以及 反斜線\ NULL時自動加上反斜線&#xff0c;進行自動轉義。注釋&#xff1a;默認情況下&#xff0c;PH…

JDK中的設計模式

Zen的JCG合作伙伴Brian Du Preez 是IT藝術領域的合作伙伴&#xff0c;他在收集JDK中最常見的設計模式方面做得非常出色。 模式列表確實令人印象深刻且很長&#xff0c;所以讓我們不再ba不休&#xff0c;向您展示它。 前幾天&#xff0c;我在企業Dev中看到了Rob Williams Brain …

414. 第三大的數

給你一個非空數組&#xff0c;返回此數組中 第三大的數 。如果不存在&#xff0c;則返回數組中最大的數 方法一 首先將數組排序&#xff0c;然后通過集合去除重復的元素&#xff0c;最后進行一次判斷&#xff0c;選擇第三大元素還是最大元素 class Solution {public int thir…

bufferevent 與 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多時候&#xff0c;除了響應事件之外&#xff0c;應用還希望做一定的數據緩沖。比如說&#xff0c;寫入數據的時候&#xff0c;通常的運行模式是&#xff1a; l 決定要向連接寫入一些數據&#xff0c;把數據放入到緩沖…

Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

A. Help Farmer題目連接&#xff1a; http://www.codeforces.com/contest/142/problem/A Description Once upon a time in the Kingdom of Far Far Away lived Sam the Farmer. Sam had a cow named Dawn and he was deeply attached to her. Sam would spend the whole summe…

電力電子、電機控制系統的建模和仿真_清華團隊研發,首款國產電力電子仿真軟件來啦~已捐贈哈工大、海工大、清華使用!...

點擊上方電氣小青年&#xff0c;關注并星標由于微信改版&#xff0c;只有星標才能及時看到我們的消息哦━━━━━━推薦閱讀&#xff1a;《膜拜大神&#xff01;清華大學電機系2021年接收推薦免試直碩(博)生擬錄取名單公示&#xff01;》《滴滴程序員年薪80萬被鄙視不如在二本…

JVM如何處理鎖

當我們談論最新版本的Sun Hotspot Java虛擬機1.6時&#xff0c;當您嘗試從java.util.concurrent.locks.Lock實現獲取鎖或輸入同步塊時&#xff0c;JVM將執行以下三種鎖類型&#xff1a; 有偏見的 &#xff1a;有時即使在并發系統中也沒有爭用&#xff0c;并且在這種情況下&…

基于node.js及express實現中間件,實現post、get

首先&#xff0c;當然是有必要的環境&#xff0c;安裝node&#xff0c;這個我就不多說了。 依賴模塊&#xff1a; "express": "^4.13.4", "request": "^2.72.0", "body-parser": "^1.13.3",頁面 $.ajax({type: &q…

可視化分析之圖表選擇

轉載于:https://www.cnblogs.com/yymn/p/4783631.html

定義并調用函數輸出 fibonacci 序列_科學網—Zmn-0351 薛問天:再談數學概念的定義,評新華先生《0345》...

Zmn-0351 薛問天&#xff1a;再談數學概念的定義&#xff0c;評新華先生《0345》【編者按。下面是薛問天先生發來的文章。是對《Zmn-0345》新華先生文章的評論。現在發布如下&#xff0c;供網友們共享。請大家關注并積極評論。另外本《專欄》重申&#xff0c;這里純屬學術討論&…

Java和內存泄漏

總覽 術語“內存泄漏”在Java中的使用方式不同于在其他語言中使用的方式。 通用術語中的“內存泄漏”是什么意思&#xff0c;在Java中如何使用&#xff1f; 維基百科的定義 當計算機程序消耗內存但無法將其釋放回操作系統時&#xff0c;就會發生計算機科學中的內存泄漏&#x…

453. 最小操作次數使數組元素相等

給你一個長度為 n 的整數數組&#xff0c;每次操作將會使 n - 1 個元素增加 1 。返回讓數組所有元素相等的最小操作次數。 class Solution {public int minMoves(int[] nums) {int res 0;int sum 0;int n nums.length;for(int i 0;i<n;i){sum nums[i];}res sum - min…

第二章 TCP/IP 基礎知識

第二章 TCP/IP 基礎知識 TCP/IP transmission control protocol and ip internet protocol 是互聯網眾多通信協議中最為著名的。 2.2 TCP/IP 的標準化 2.2.2 TCP/IP 標準化精髓 TCP/IP 協議始終具有很強的實用性。 相比于TCP/IP &#xff0c;OSI 之所以未能達到普及&#xff0…

CSS太陽月亮地球三角戀旋轉效果

純粹玩一下&#xff0c;好像沒有什么實際的卵用&#xff0c;but&#xff0c;純玩買不了上當&#xff0c;純玩買不了受騙。。。。。。。。 地月旋轉的一個css效果&#xff0c;無聊玩玩&#xff0c;可以復制到記事本試試 <!DOCTYPE html><html lang"en">&l…

gorm preload 搜索_LeetCode刷題筆記|95:不同的二叉搜索樹 II

題目描述給定一個整數 n&#xff0c;生成所有由 1 ... n 為節點所組成的 二叉搜索樹 。示例輸入&#xff1a;3輸出&#xff1a;[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解釋&#xff1a;以上的輸出對應以下 5 種不同結構的二叉搜索樹&#xf…

Java初學者指南

Java編程的第一步。 對于Java中的入門教程&#xff0c;請參閱Sun的官方幫助這里 除了核心語言外&#xff0c;還有幾種技術和API 介紹。 我們建議首先閱讀涵蓋 基礎知識&#xff0c;并繼續其余的教程。 我們建議&#xff1a; 保持代碼簡單易讀 拆分邏輯組件&#xff08;類…

Javascript中Promise對象的實現

http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/轉載于:https://www.cnblogs.com/zuiyirenjian/p/4787864.html

字符串分割與存入List集合

List<string> namelist new List<string>(); string[] namejh null; string name "張三李四王五"; 第一步&#xff1a;將三個名字分離出來 namejh name.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); namelist new Li…