gpt4 book ai didi

java - 使用 binding.xml 重命名 JAXB 根​​类

转载 作者:行者123 更新时间:2023-11-29 08:58:51 26 4
gpt4 key购买 nike

我使用 Eclipse 中的 Dali 插件通过 xsd 文件生成 Java 类,该文件实际上只是在模式文件上调用 xjc。我使用了建议 here通过将 XML 绑定(bind)文件应用于类生成来解决命名冲突。这很有效,但我试图通过重命名根元素来更进一步,结果是我丢失了 XmlRootElement 注释。我尝试使用 annox 重新添加根元素注释,但出现此错误:不支持的绑定(bind)命名空间“http://annox.dev.java.net”。也许您的意思是“http://java.sun.com/xml/ns/jaxb/xjc ”?

这是我的初始 binding.xml 文件(没有 annox):

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
version="2.1">
<!-- Force all classes to be generated at the top level, this will potentially cause name conflicts -->
<jaxb:globalBindings localScoping="toplevel"/>
<jaxb:bindings schemaLocation="mySchema-1.0.0.xsd">
<!-- Rename the root element -->
<jaxb:bindings node="//xs:element[@name='MyRootClassNameIsReallyLong']/xs:complexType">
<jaxb:class name="ShorterName"/>
</jaxb:bindings>
<!-- Rename the Bar class to resolve a naming conflict -->
<jaxb:bindings node="//xs:element[@name='Foo']/xs:complexType/xs:sequence/xs:element[@name='Bar']/xs:complexType">
<jaxb:class name="FooBar"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

顺便说一句,值得注意的是,架构文件来自第三方,所以我没有兴趣修改它。同样,我不想篡改生成的 Java 文件,所以这就是我对绑定(bind) xml 方法感兴趣的原因。

编辑 (9/11/2013) - 这是带有 annox 的绑定(bind) XML:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
xmlns:annox="http://annox.dev.java.net"
version="2.1">
<!-- Force all classes to be generated at the top level, this will potentially cause name conflicts -->
<jaxb:globalBindings localScoping="toplevel"/>
<jaxb:bindings schemaLocation="mySchema-1.0.0.xsd">
<!-- Rename the root element -->
<jaxb:bindings node="//xs:element[@name='MyRootClassNameIsReallyLong']/xs:complexType">
<jaxb:class name="ShorterName"/>
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="MyRootClassNameIsReallyLong" />
</annox:annotate>
</jaxb:bindings>
<!-- Rename the Bar class to resolve a naming conflict -->
<jaxb:bindings node="//xs:element[@name='Foo']/xs:complexType/xs:sequence/xs:element[@name='Bar']/xs:complexType">
<jaxb:class name="FooBar"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

最佳答案

Annox 是一个 XJC 附加组件,所以除了声明命名空间前缀 (xmlns:annox="http://annox.dev.java.net) 之外,您还需要声明它作为 extensionBindingPrefix

您的开始标签应该如下所示:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb
http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
jaxb:extensionBindingPrefix="annox"
version="2.1">

关于java - 使用 binding.xml 重命名 JAXB 根​​类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18699331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com