草庐IT

xml - jaxb 不会为相同类型的不同元素生成类

coder 2024-06-30 原文

xsd 模式包含两个具有相同类型的不同元素:

<element name="subscriber" type="ns1:CreateSubscriberType"/>
<element name="systemSubscriber" type="ns1:CreateSubscriberType"/>

<complexType name="CreateSubscriberType">
<annotation>
  <documentation>bla bla bla</documentation>
</annotation>
<sequence>
  <element name="Header" type="ns2:DocumentHeader"/>
  <element name="SubscriberDefault" type="ns2:SubscriberDefaultType">
    <annotation>
      <documentation>bla bla</documentation>
    </annotation>
  </element>
</sequence>
</complexType>

xsd 模式包含两个具有相同类型的不同元素: 然后我尝试使用 maven-jaxb2-plugin 从这个 xsd 生成类,但没有结果。没有生成类。如果我更改其中一个元素的类型,它将正常工作并生成 2 个类。我没有在官方文档中找到解释。任何人都可以遇到这样的问题以及如何解决它

最佳答案

JAXB (JSR-222) 实现将为每个复杂类型生成一个类。这很好,因为可以在与该类型的属性/元素对应的任何字段/属性上设置此类的实例。对于命名的复杂类型,引用它们的全局元素将被捕获为 ObjectFactory 类中的元数据。

schema.xsd

下面是您的 XML 模式的一个稍微简化的版本:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org"
    xmlns:ns1="http://www.example.org" elementFormDefault="qualified">

    <element name="subscriber" type="ns1:CreateSubscriberType" />
    <element name="systemSubscriber" type="ns1:CreateSubscriberType" />

    <complexType name="CreateSubscriberType">
        <annotation>
            <documentation>bla bla bla</documentation>
        </annotation>
        <sequence/>
    </complexType>

</schema>

新江西来电

xjc -d out -p forum8941337 schema.xsd

创建订阅者类型

下面是为复杂类型生成的类:

package forum8941337;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CreateSubscriberType")
public class CreateSubscriberType {

}

对象工厂

生成的 ObjectFactory 类包含两个用 @XmlElementDecl 注释的 create 方法,它们对应于 XML 模式中的两个全局元素。

package forum8941337;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    private final static QName _Subscriber_QNAME = new QName("http://www.example.org", "subscriber");
    private final static QName _SystemSubscriber_QNAME = new QName("http://www.example.org", "systemSubscriber");

    public ObjectFactory() {
    }

    public CreateSubscriberType createCreateSubscriberType() {
        return new CreateSubscriberType();
    }

    @XmlElementDecl(namespace = "http://www.example.org", name = "subscriber")
    public JAXBElement<CreateSubscriberType> createSubscriber(CreateSubscriberType value) {
        return new JAXBElement<CreateSubscriberType>(_Subscriber_QNAME, CreateSubscriberType.class, null, value);
    }

    @XmlElementDecl(namespace = "http://www.example.org", name = "systemSubscriber")
    public JAXBElement<CreateSubscriberType> createSystemSubscriber(CreateSubscriberType value) {
        return new JAXBElement<CreateSubscriberType>(_SystemSubscriber_QNAME, CreateSubscriberType.class, null, value);
    }

}

演示

package forum8941337;

import javax.xml.bind.*;
public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("forum8941337");
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        CreateSubscriberType subscriberType = new CreateSubscriberType();
        ObjectFactory objectFactory = new ObjectFactory();

            // System Subscriber
        JAXBElement<CreateSubscriberType> systemSubscriber = objectFactory.createSystemSubscriber(subscriberType);
        marshaller.marshal(systemSubscriber, System.out);

            // Subscriber
        JAXBElement<CreateSubscriberType> subscriber = objectFactory.createSubscriber(subscriberType);
        marshaller.marshal(subscriber, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<systemSubscriber xmlns="http://www.example.org"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subscriber xmlns="http://www.example.org"/>

关于xml - jaxb 不会为相同类型的不同元素生成类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8941337/

有关xml - jaxb 不会为相同类型的不同元素生成类的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  9. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  10. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

随机推荐