JAXB和根元素

@XmlRootElement是人們習慣于與JAXB(JSR-222)一起使用的注釋。 目的是將根元素與類唯一關聯。 由于JAXB類映射到復雜類型,因此一個類有可能對應于多個根元素。 在這種情況下,無法使用@XmlRootElement ,人們開始感到有些困惑。 在本文中,我將演示如何使用@XmlElementDecl映射此用例。

XML模式

下面的XML模式包含三個根元素: customerbilling-addressshipping-addresscustomer元素具有匿名的復雜類型,而billing-addressshipping-address具有相同的命名類型( address-type )。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/customer" xmlns="http://www.example.org/customer" elementFormDefault="qualified"><xs:element name="customer"><xs:complexType><xs:sequence><xs:element ref="billing-address"/><xs:element ref="shipping-address"/></xs:sequence></xs:complexType></xs:element><xs:complexType name="address-type"><xs:sequence><xs:element name="street" type="xs:string"/></xs:sequence></xs:complexType><xs:element name="billing-address" type="address-type"/><xs:element name="shipping-address" type="address-type"/></xs:schema>

生成模型

下面是從XML模式生成的JAXB模型。 將JAXB批注添加到現有Java模型時,將應用相同的概念。

顧客

JAXB域類對應于復雜類型。 由于customer元素具有匿名復雜類型,因此Customer類具有@XmlRootElement批注。 這是因為只有一個XML元素可以與匿名類型相關聯。

package org.example.customer;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"billingAddress","shippingAddress"})
@XmlRootElement(name = "customer")
public class Customer {@XmlElement(name = "billing-address", required = true)protected AddressType billingAddress;@XmlElement(name = "shipping-address", required = true)protected AddressType shippingAddress;public AddressType getBillingAddress() {return billingAddress;}public void setBillingAddress(AddressType value) {this.billingAddress = value;}public AddressType getShippingAddress() {return shippingAddress;}public void setShippingAddress(AddressType value) {this.shippingAddress = value;}}

地址類型

同樣,因為JAXB模型類對應于復雜類型,所以會為地址類型的復雜類型生成一個類。 由于此命名的復雜類型可能存在多個根級別元素,因此不會使用@XmlRootElement對其進行注釋。

package org.example.customer;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "address-type", propOrder = {"street"})
public class AddressType {@XmlElement(required = true)protected String street;public String getStreet() {return street;}public void setStreet(String value) {this.street = value;}}

對象工廠

@XmlElementDecl批注用于表示與命名的復雜類型相對應的根元素。 它放在@XmlRegistry注釋的類中的工廠方法上(從XML模式生成時,該類始終稱為ObjectFactory )。 factory方法返回包裝在JAXBElement實例中的域對象 JAXBElement具有一個QName ,它表示元素名稱和名稱空間URI。

package org.example.customer;import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;@XmlRegistry
public class ObjectFactory {private final static QName _BillingAddress_QNAME = new QName("http://www.example.org/customer", "billing-address");private final static QName _ShippingAddress_QNAME = new QName("http://www.example.org/customer", "shipping-address");public ObjectFactory() {}public Customer createCustomer() {return new Customer();}public AddressType createAddressType() {return new AddressType();}@XmlElementDecl(namespace = "http://www.example.org/customer", name = "billing-address")public JAXBElement<AddressType> createBillingAddress(AddressType value) {return new JAXBElement<AddressType>(_BillingAddress_QNAME, AddressType.class, null, value);}@XmlElementDecl(namespace = "http://www.example.org/customer", name = "shipping-address")public JAXBElement<AddressType> createShippingAddress(AddressType value) {return new JAXBElement<AddressType>(_ShippingAddress_QNAME, AddressType.class, null, value);}}

包裝信息

package-info類用于指定名稱空間映射(請參見JAXB和Namespaces )。

@XmlSchema(namespace = "http://www.example.org/customer", elementFormDefault = XmlNsForm.QUALIFIED)
package org.example.customer;import javax.xml.bind.annotation.*;

非海警行動

現在我們來看一下解組XML時根元素類型的影響。

customer.xml

下面是一個示例XML文檔,其中有customer作為根元素。 請記住, customer元素具有匿名的復雜類型。

<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns="http://www.example.org/customer"><billing-address><street>1 Any Street</street></billing-address><shipping-address><street>2 Another Road</street></shipping-address>
</customer>

shipping.xml

這是一個示例XML文檔,其中shipping-address作為根元素。 送貨地址元素具有命名的復雜類型。

<?xml version="1.0" encoding="UTF-8"?>
<shipping-address xmlns="http://www.example.org/customer"><street>2 Another Road</street>
</shipping-address>

解組演示
?
當解組與用@XmlRootElement注釋的類相對應的XML時,您將獲得域對象的實例。 但是,當解組與用@XmlElementDecl注釋的類相對應的XML時,您將得到包裝在J AXBElement實例中的域對象。 在此示例中,您可能需要使用JAXBElement中QName來確定是否對帳單地址或收貨地址進行了編組。

package org.example.customer;import java.io.File;
import javax.xml.bind.*;public class UnmarshalDemo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance("org.example.customer");Unmarshaller unmarshaller = jc.createUnmarshaller();// Unmarshal CustomerFile customerXML = new File("src/org/example/customer/customer.xml");Customer customer = (Customer) unmarshaller.unmarshal(customerXML);// Unmarshal Shipping AddressFile shippingXML = new File("src/org/example/customer/shipping.xml");JAXBElement<AddressType> je = (JAXBElement<AddressType>) unmarshaller.unmarshal(shippingXML);AddressType shipping = je.getValue();}}

Unmarshal演示– JAXBIntrospector
?
如果您不想記住解組操作的結果是域對象還是JAXBElement ,則可以使用JAXBIntrospector.getValue(Object)方法始終獲取域對象。

package org.example.customer;import java.io.File;
import javax.xml.bind.*;public class JAXBIntrospectorDemo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance("org.example.customer");Unmarshaller unmarshaller = jc.createUnmarshaller();// Unmarshal CustomerFile customerXML = new File("src/org/example/customer/customer.xml");Customer customer = (Customer) JAXBIntrospector.getValue(unmarshaller.unmarshal(customerXML));// Unmarshal Shipping AddressFile shippingXML = new File("src/org/example/customer/shipping.xml");AddressType shipping = (AddressType) JAXBIntrospector.getValue(unmarshaller.unmarshal(shippingXML));}}

元帥行動
?
您可以直接將帶有@XmlRootElement注釋的對象編組為XML。 與@XmlElementDecl批注對應的類必須首先包裝在JAXBElement的實例中。 用@XmlElementDecl注釋的工廠方法是最簡單的方法。 如果您是從XML模式生成模型的,則工廠方法位于ObjectFactory類中。

package org.example.customer;import javax.xml.bind.*;public class MarshalDemo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance("org.example.customer");Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// Create Domain ObjectsAddressType billingAddress = new AddressType();billingAddress.setStreet("1 Any Street");Customer customer = new Customer();customer.setBillingAddress(billingAddress);// Marshal Customermarshaller.marshal(customer, System.out);// Marshal Billing AddressObjectFactory objectFactory = new ObjectFactory();JAXBElement<AddressType> je =  objectFactory.createBillingAddress(billingAddress);marshaller.marshal(je, System.out);}}

輸出量

以下是運行演示代碼的輸出。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer xmlns="http://www.example.org/customer"><billing-address><street>1 Any Street</street></billing-address>
</customer>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<billing-address xmlns="http://www.example.org/customer"><street>1 Any Street</street>
</billing-address>

參考: Java XML和JSON綁定博客中的JCG合作伙伴 Blaise Doughan的JAXB和Root Elements 。


翻譯自: https://www.javacodegeeks.com/2012/08/jaxb-and-root-elements.html

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

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

相關文章

python socket模塊實現udp通信_Python基于socket模塊實現UDP通信功能示例

Python基于socket模塊實現UDP通信功能示例本文實例講述了Python基于socket模塊實現UDP通信功能。分享給大家供大家參考&#xff0c;具體如下&#xff1a;一 代碼1、接收端import socket#使用IPV4協議&#xff0c;使用UDP協議傳輸數據ssocket.socket(socket.AF_INET, socket.SOC…

Hibernate緩存基礎知識

最近&#xff0c;我嘗試了休眠緩存。 在這篇文章中&#xff0c;我想分享我的經驗&#xff0c;并指出Hibernate Second Level Cache的一些細節。 在此過程中&#xff0c;我將指導您閱讀一些有助于實現緩存的文章。 讓我們從地面開始。 在休眠狀態下緩存 緩存功能旨在減少必要的…

TP3.2之WHERE組合條件處理

1、條件都是int類型&#xff1a; $User->where(type1 AND status1)->select(); 2、條件包含字符串類型&#xff1a; 使用3.1以上版本的話&#xff0c;使用字符串條件的時候&#xff0c;建議配合預處理機制&#xff0c;確保更加安全&#xff0c; $Model->where("i…

linux-ssh遠程后臺執行腳本-放置后臺執行問題(轉)

寫了一個監控負載的小腳本&#xff08;死循環&#xff0c;測試結束后再kill對應進程&#xff09;&#xff0c;因需要監控多臺服務器&#xff0c;所以在一臺服務器上使用ssh統一執行腳本遇到問題&#xff1a;使用ssh root172.16.146.20 /usr/local/luly/loadavg.sh 2 2 &執行…

python2.7輸入函數_Python2.7的用戶輸入函數有問題,無法讓這些輸入與程序一起工作...

我對python世界還是個新手&#xff0c;雖然我已經用php做了很多工作。。。這是我的案子。。。在我正在用python2.7為我的小程序編寫一些代碼。在在那個程序中&#xff0c;我需要2個用戶輸入&#xff0c;它們都是數字。在第一個數字不得大于11&#xff0c;也不得小于0。在第二個…

創建Java動態代理

Java動態代理機制提供了一種有趣的方式來創建代理實例。 不過&#xff0c;創建動態代理的步驟有些繁瑣&#xff0c;請考慮將代理用于審核服務實例的方法調用所花費的時間– public interface InventoryService {public Inventory create(Inventory inventory);public List<I…

html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?...

新特性&#xff1a; 1. 拖拽釋放(Drag and drop) API 2. 語義化更好的內容標簽&#xff08;header,nav,footer,aside,article,section&#xff09; 3. 音頻、視頻API(audio,video) 4. 畫布(Canvas) API 5. 地理(Geolocation) API 6. 本地離線存儲 localStorage 長期存儲數據&am…

Substring with Concatenation of All Words 題解

題意 You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. For example, give…

java udp丟包_linux 系統 UDP 丟包問題分析思路

最近工作中遇到某個服務器應用程序 UDP 丟包&#xff0c;在排查過程中查閱了很多資料&#xff0c;總結出來這篇文章&#xff0c;供更多人參考。在開始之前&#xff0c;我們先用一張圖解釋 linux 系統接收網絡報文的過程。● 首先網絡報文通過物理網線發送到網卡● 網絡驅動程…

【SQL】分組數據,過濾分組-group by , having

學習筆記&#xff0c;原文來自http://blog.csdn.net/robinjwong/article/details/24845125 創建分組 - GROUP BY 分組是在SELECT語句的GROUP BY子句中建立的。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域&#xff0c;然后針對若干個小區域進行數據處理。SELECT子…

使用EasyMock或Mockito

我大部分時間都在使用EasyMock &#xff0c;但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一項目中使用兩個框架來實現相同的目的&#xff0c;因此我采用了Mockito 。 因此&#xff0c;在過去的幾個月中&#xff0c;我一直在使用Mockito &#xff0c;這是我…

CentOS下iptables 配置詳解

如果你的IPTABLES基礎知識還不了解,建議先去看看. 開始配置 我們來配置一個filter表的防火墻. (1)查看本機關于IPTABLES的設置情況 [roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy…

java lambda 多個參數_Java Lambda行為參數化

Java Lambda行為參數化我們可以將lambda表達式作為參數傳遞給方法。例子以下代碼創建了一個名為Calculator的函數接口。在Calculator中有一個稱為calculate的方法&#xff0c;它接受兩個int參數并返回一個int值。在Main類中有一個引擎方法&#xff0c;它接受函數接口Calculator…

具有關聯映射的Hibernate Composite ID

最近&#xff0c;我們面臨著帶有復合id字段的休眠關聯映射的棘手情況。 我們需要與一對一和多對一建立雙向關聯。我們的拖曳表是“ REPORT”和“ REPORT_SUMMARY”&#xff0c;它們之間具有從REPORT到REPORT_SUMMARY的一對多關系&#xff0c;而從REPORT_SUMMARY到REPORT表。 RE…

ZooKeeper應用場景

ZooKeeper是一個高可用的分布式數據管理與系統協調框架。基于對Paxos算法的實現&#xff0c;使該框架保證了分布式環境中數據的強一致性&#xff0c;也正是基于這樣的特性&#xff0c;使得ZooKeeper解決很多分布式問題。網上對ZK的應用場景也有不少介紹&#xff0c;本文將結合作…

java main test_java調用main自動執行testng方法一

主方法import com.com.utlis.createTestngXml;import org.testng.TestNG;import java.util.ArrayList;import java.util.List;/*** author lw* createTime 2019/3/30 15:35* description testng調試類*/public class inittet {private static final String ESCAPE_PROPERTY &q…

有趣的Ruby-學習筆記3

Ruby方法方法名要以小寫字母開頭。假設用大寫字母開頭會被作為常量 &#xff08;這點非常奇怪&#xff09;定義一個無參的方法def method_name expr.. end定義一個有參的方法def method_name (var1, var2)expr.. end給參數設定默認值def method_name (var1value1, var2value2)e…

ADF:動態視圖對象

今天&#xff0c;我想寫有關動態視圖對象的文章&#xff0c;它允許我在運行時更改其數據源&#xff08;SQL查詢&#xff09;和屬性。 我將使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法來解決此問題。 我將逐步介紹如何執行此操作 創建視圖對象和應…

java stack list_JAVA自己實現List接口Stack

package 集合.Stack;import java.util.Arrays;import java.util.EmptyStackException;import java.util.Vector;public class MyStack {//底層數組默認長度為10private Object[] myStack new Object[10];//sizeprivate int size 0;public MyStack() {}//pushpublic Object pu…

刷題總結——序列操作(權值線段樹套樹狀數組)

題目&#xff1a; 題目描述 給出序列 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff08;0≤ai≤109&#xff09;&#xff0c;有關序列的兩種操作。 1. ai&#xff08;1≤i≤n&#xff09;變成 x&#xff08;0≤x≤109&#xff09;。 2. 求 al&#xff0c;al1&#xff…