jaxb 解析list元素

@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

jaxb 解析list元素

jaxb 解析list元素_JAXB和根元素相关推荐

  1. XML 解析错误:找不到根元素

    现象: 使用ajax通信请求数据,浏览器控制台报"XML 解析错误:找不到根元素"错误 原因: 原因是后台数据返回值为null. 具体原因需分析确认,比如 ·后台响应方法为priv ...

  2. 文档中根元素后面的标记格式必须正确。

    文档中根元素后面的标记格式必须正确. php或其它语言动态输出的xml,最开始<标记 前面有空格,最后面>标记 后面有 空格 导致xml解析出错 解决办法: var data:String ...

  3. . mybatis指定配置文件的根元素_MyBatis框架

    1. MyBatis 环境搭建 jar 包详解 1.1 创建项目 java project 1.2 导入 jar 包 1.2.1 MyBatis 核心 jar mybatis-3.2.7.jar 1. ...

  4. vue学习-v-if v-for优先级、data、key、diff算法、vue组件化、vue设计原则、组件模板只有一个根元素、MVC.MVP,MVVM

    1:v-if和v-for哪个优先级更高?如果两个同时出现,应该怎么优化得到更好的性能? //在vue页面中 同时使用v-for与v-if后,打印渲染函数. console.log(app.$optio ...

  5. html设置根rem,经过js动态设置根元素的rem方案

    rem目前是响应式开发移动端一个很重要也是经常使用的一个元素,可是在网上看的各类文章都会超级懵逼.因此我在下面给出两个方案,也列举出使用方法,让你们一目了然.前提是设计稿以750为准.其中测试的设计稿 ...

  6. 解决Spring的java项目打包后执行出现“无法读取方案文档...“、“原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是...”问题

    解决Spring的java项目打包后执行出现"无法读取方案文档..."."原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是..."问题 ...

  7. 解析错误:相邻的JSX元素必须包装在一个封闭标签中

    本文翻译自:Parse Error: Adjacent JSX elements must be wrapped in an enclosing tag I am trying to set up m ...

  8. 数组元素数组中的元素通过解析字符串参数获得

    返回数组,数组元素数组中的元素通过解析字符串参数获得 编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得,字符串如下"1,2:3,4,5:6,7"对应的数 ...

  9. XML 文档(0, 0)中有错误。缺少根元素。

    function T Validate(string str){ using (MemoryStream ms = new MemoryStream()) { foreach (byte _byte ...

最新文章

  1. 五菱宏光s1图片及价格图片_全新五菱宏光S来了,还在念念不忘S1吗?国六机头还颜值在线...
  2. EasyHook远程代码注入
  3. .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
  4. 网络开发必备的HTTP协议知识
  5. 解决AutoCAD2010安装完毕后闪退问题
  6. 详解如何在vue项目中引入饿了么elementUI组件
  7. Html状态属性,html一些对象属性的介绍
  8. 父类子类的创建对象和实例化
  9. 判断网页是否是微信浏览器打开
  10. mysql 如何按时间备份_如何用mysqldump进行全量和时间点备份
  11. stm32学习------stm32控制L298N电动机
  12. 辽宁电信TY12008-Z_智能机顶盒2.0_S905MB_线刷固件包
  13. 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥
  14. c语言eval函数,百行代码轻便实现C#中的Eval函数
  15. tensorflow2.3版本 LSTM作为最后输出层 报错Function call stack: train_function -> train_function -> train_functio
  16. 武汉大学和厦门大学计算机,武汉大学和厦门大学谁更强,为什么有人说这两所大学名气大于实力...
  17. 特殊教育学校计算机教学计划,特教学校教学工作计划(精选3篇)
  18. Facebook股票抢夺战:中国富人争做股东【转】
  19. Dinic算法 (优化)
  20. 学习笔记 broswerify + watchify + beefy

热门文章

  1. 阿里巴巴对Java编程【OOP规约】的规约
  2. Java中的宏变量,宏替换详解。
  3. Java Excel导出
  4. 输入框限定保留三位小数点
  5. java中如何对对象排序?
  6. 复制一个5G文件只需要两秒,全网最牛方法!
  7. matlab盒子分形维数_分形:盒子维数
  8. spark ui_Spark UI的见解
  9. java项目使用junit_在Java 8之前的项目中使用JUnit 5
  10. api自动化测试_API测试和自动化101:基本指南