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.mzph.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…