我有4节课. Person类,以及使用Phone和Address类扩展它的抽象Contactinformation.
@XmlRootElement
@XmlAccessorType(XmlAccesstype.NONE)
public class Person {
    @XmlElement(required = true,nillable = false)
    private String first;
    @XmlElement(required = true,nillable = false)
    private String last;
    @XmlElementWrapper(name = "contacts")
    @XmlElementRefs({
        @XmlElementRef(name = "phone",type = Phone.class,required = true),@XmlElementRef(name = "address",type = Address.class,required = true)
    })
    private final List<ContactInfomation> contacts = new ArrayList<>();
}

Contactinformation仅用作容器:

public abstract class ContactInfomation { /* empty class */ }

电话类:

@XmlRootElement
@XmlAccessorType(XmlAccesstype.NONE)
public class Phone extends ContactInfomation {
    @XmlElement(required = true,nillable = false)
    private String number;
}

和地址类:

@XmlRootElement
@XmlAccessorType(XmlAccesstype.NONE)
public class Address extends ContactInfomation {
    @XmlElement(required = true,nillable = false)
    private String country;
    @XmlElement(required = true,nillable = false)
    private String city;
}

问题是当我在Person类中将@XmlElementrefs更改为@XmlElements时,没有任何反应. JAXB将它们映射到xs:choice. XML输出与以前相同,schemagen生成与以前相同的模式.
这是一个示例输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <first>majid</first>
    <last>azimi</last>
    <contacts>
        <address>
            <country>US</country>
            <city>Los Angles</city>
        </address>
        <address>
            <country>US</country>
            <city>New York</city>
        </address>
        <phone>
            <number>5551037</number>
        </phone>
    </contacts>
</person>

这是架构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="address" type="address"/>

  <xs:element name="person" type="person"/>

  <xs:element name="phone" type="phone"/>

  <xs:complexType name="person">
    <xs:sequence>
      <xs:element name="first" type="xs:string"/>
      <xs:element name="last" type="xs:string"/>
      <xs:element name="contacts" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element ref="phone"/>
              <xs:element ref="address"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="phone">
    <xs:complexContent>
      <xs:extension base="contactInfomation">
        <xs:sequence>
          <xs:element name="number" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="contactInfomation" abstract="true">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="address">
    <xs:complexContent>
      <xs:extension base="contactInfomation">
        <xs:sequence>
          <xs:element name="country" type="xs:string"/>
          <xs:element name="city" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

@XmlElementRef的文档将其用于替换组和XML选择.我完全混淆了@ XmlElementRefs / @ XmlElementRef和@ XmlElements / @ XmlElement的区别.有人可以帮忙吗?

解决方法

TL; DR

@XmlElement和@XmlElementRef之间的基本区别

@XmlElement和@XmlElementRef之间的区别在于,相应的生成元素是否包含本地元素定义或对全局元素定义的引用.

选择和替代团体

XML Schema中的选择实际上是替换组可以完成的超集.因此,为了简化映射,JAXB利用两个映射.

JAXB和Schema Generation

JAXB可以从任何XML Schema生成Java模型,另一方面JAXB不保留有关XML模式的所有元数据.因此,JAXB无法生成每个XML架构.

@ XmlElementRefs / @ XmlElementRef和@XmlRootElement

以下是您的模型中的内容.

我修改了联系人字段上的映射,以使映射到Address类更加清晰.

@XmlElementWrapper(name = "contacts")
@XmlElementRefs({
    @XmlElementRef(name = "phone",@XmlElementRef(name = "ADDRESS",required = true)
})
private final List<ContactInfomation> contacts = new ArrayList<>();

电话

使用@XmlElementRef进行映射时,指定的信息需要与@XmlRootElement或@XmlElementDecl提供的全局元素定义相对应(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).默认情况下,Person类的根元素为person.

@XmlRootElement
public class Person {

地址

我使用了@XmlRootElement批注来覆盖Address类的默认名称.

@XmlRootElement(name="ADDRESS")
public class Address extends ContactInfomation {

生成的XML架构

这是生成的架构.我们看到选择结构中的元素定义利用引用现有元素而不是定义局部元素.

<xs:element name="contacts" minOccurs="0">
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element ref="phone"/>
          <xs:element ref="ADDRESS"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

@ XmlElements / @ XmlElement的

我已将联系人字段上的映射更改为使用@XmlElements.

@XmlElementWrapper(name = "contacts")
@XmlElements({
    @XmlElement(name = "phone-number",@XmlElement(name = "home-address",required = true)
})
private final List<ContactInfomation> contacts = new ArrayList<>();

电话

所有引用的类都不需要使用@XmlRootElement注释(或者具有相应的@XmlElementDecl注释.

public class Phone extends ContactInfomation {

地址

如果他的类确实有@XmlRootElement注释,则不需要匹配@XmlElements中的@XmlElement注释.

@XmlRootElement(name="ADDRESS")
public class Address extends ContactInfomation {

生成的XML架构

这是生成的架构.我们看到选择结构中的元素定义现在被定义为局部元素.

<xs:element name="contacts" minOccurs="0">
    <xs:complexType>
      <xs:sequence>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="phone-number" type="phone"/>
          <xs:element name="home-address" type="address"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

java – JAXB将@XmlElementRefs和@XmlElements转换为xs:choice的更多相关文章

  1. Swift iOS 9通讯录访问

    viewmode=list我的stackoverflow前言:在iOS9之前,一直使用AddressBook这个framework来访问用户通讯录。

  2. [Swift] Enum 好用, Enum 可以更易用

    只需要写少量的几行声明:如下.选中,右键,选择"Services|generate_enum"然后如下代码就自动生成了:怎么样?当然还有其他选项可以使用.如果你有其他需要麻烦告诉我.当然有PR最好了.最后来张动图感受一下:代码在:OSCGitGithub

  3. swift – 交换机:枚举交换机问题:不是int的成员

    我在Swift中编写了我的第一个项目,由于某种原因,我无法找出为什么我的枚举和开关不工作属性开关我得到的错误是枚举大小写“viewmodeFavourite”不是“Int!”类型的成员所以我改为这个,因为它不是一个Int!forStoryboard)然后我得到枚举大小写模式不能匹配非枚举类型“Int”的值你必须将contactviewmode声明为Contactviewmode而不是Int。如果您真的希望它是Int,那么您必须通过将变量与枚举情况的rawValue属性进行比较来更改交换机中的大小写:但除非

  4. android – ContactsContract.CommonDataKinds.StructuredName的问题

    在查询联系人数据时,我得到了大部分工作.我正在与Structuredname和Organization战斗.他们不适合我.如果您不介意,请查看代码.它是手工制作的,并且删除了大量错误检查,以使其尽可能小地发布在此处.“不工作”的评论是对我不起作用的部分.两个前导if()是onActivityResult的一部分,我在联系人选择结束时收到数据.通过以下方式拨打电话:提前谢谢了HJW解决方法你的情况是错的.用于Structuredname:

  5. 如何在我的Android程序中访问联系人

    我正在制作短信应用程序并希望在我的Android应用程序中访问联系人.我想访问联系人,就像他们在实际联系人列表中的位置一样.选择后,我需要返回我的活动,我可以向该人发送短信.或者是否可以访问存储联系人的数据库?我的代码如下所示:我的LogCat看起来像这样:谁能帮我?解决方法使用此代码选择联系人:

  6. 如何避免在Android上的onCreate上重新创建视图?

    如何避免重新创建列表?

  7. 启动时Android应用程序崩溃:ContactsFragment中的SQLite NullPointerException

    我正在集成数据库来保存和存储以后要检索的基本联系信息.但是,我的应用程序现在在启动时崩溃,所以我甚至无法验证是否正在创建表等.数据库处理程序代码:logcat说问题是sqliteDatabasedb=this.getWriteableDatabase();这也是我违规的Contactsfragment:最后,这是ContactsDB类:非常感谢任何帮助–我认为问题在于我的Context为null.

  8. 在android中获取联系人非常慢

    我编写了一个代码来从联系人中获取联系人姓名,电话号码和图像,并将其显示在android的listview中.它工作正常,但需要更多时间来加载.我曾尝试在代码的某些部分使用多线程.但加载时间并未减少.这是onCreate()方法:以下是获取联系人的代码:这里,listview的setAdapter()函数在将所有联系人提取到ArrayList之后正在工作.有没有人知道如何在获取联系人期间显示联系人?

  9. 如何获取Android中联系人的所有详细信息

    给定联系人ID,我可以通过对每个字段进行不同的查询来获取各种联系人详细信息.但有没有一种方法可以通过单个查询获取与此联系人ID相关的所有详细信息?解决方法不得不改变ContentProviders上的一些教程,因为它引用了弃用的类,这可能会有所帮助.

  10. android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?

    我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有).用户键入时正在运行实时搜索.所以他输入了ma并将获得’martin’,’matthews’……

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部