【问题标题】:Issue with JAXB: nameXmlTransform typeName prefix not workingJAXB 问题:nameXmlTransform typeName 前缀不起作用
【发布时间】:2014-02-11 03:13:48
【问题描述】:

我希望将几个模式转换为 Java 代码。模式都是相似的;例如,每个都有一个 TXLife 根对象。如果每个模式生成具有唯一类名的代码,则管理代码会更容易。我可以使用“包”绑定将每个模式中的代码放入自己的包中,但是当我尝试使用“前缀”绑定来更改类名时,它会忽略它。

这是我的 schema_bindings.xml 文件:

绑定>

当我运行 xjc 命令时,我得到了(我必须修改 xjc.bat 文件中的类路径才能使其工作):

C:\test>\progs\Java\jaxb-ri-2.2.7\bin\xjc.bat -extension -d src -b schema_bindings.xml 模式

解析架构... 编译架构... com\mycompany\hi\Holding.java com\mycompany\hi\InquiryLevel.java com\mycompany\hi\KeyedValue.java com\mycompany\hi\OLifE.java com\mycompany\hi\ObjectFactory.java com\mycompany\hi\Policy.java com\mycompany\hi\TXLife.java com\mycompany\hi\TXLifeRequest.java com\mycompany\hi\TransMode.java com\mycompany\hi\TransSubType.java com\mycompany\hi\TransType.java

我希望每个 java 文件(以及其中的类)都被命名为“Hi_”。 Jaxb 似乎完全忽略了我的“前缀”规范。 我已经尝试了绑定文件的几种变体。我还使用 Ant xjc 任务尝试了相同的绑定,所有结果都相同。

我可以处理这些结果,但这意味着处理来自一个模式的输入并将输出生成到另一个模式的代码必须使用完全限定的类名来引用对象,这很尴尬。

【问题讨论】:

    标签: java jaxb xsd


    【解决方案1】:

    TL;DR

    <jaxb:typeName prefix="Hi_"/> 对应于从命名复杂类型生成的类。您可以通过添加 <jaxb:elementName prefix="Hi_"/> 来影响从全局元素生成的类来执行以下操作:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
       <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
          <jaxb:schemaBindings>
             <jaxb:package name="com.mycompany.hi"/>
             <jaxb:nameXmlTransform>
                <jaxb:typeName prefix="Hi_"/>
                <jaxb:elementName prefix="Hi_"/>
             </jaxb:nameXmlTransform>
          </jaxb:schemaBindings>
       </jaxb:bindings>
    </jaxb:bindings> 
    

    完整示例

    下面是一个完整的例子。

    schema.xsd

    下面的模式有一个全局元素和一个命名的复杂类型。

    <?xml version="1.0" encoding="UTF-8"?>
    <schema 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/schema" 
        xmlns:tns="http://www.example.org/schema" 
        elementFormDefault="qualified">
    
        <element name="GlobalElement">
            <complexType>
                <sequence>
                    <element name="foo" type="string"/>
                </sequence>
            </complexType>
        </element>
    
        <complexType name="NamedComplexType">
            <sequence>
                <element name="bar" type="string" />
            </sequence>
        </complexType>
    
    </schema>
    

    binding.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
       <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
          <jaxb:schemaBindings>
             <jaxb:package name="com.mycompany.hi"/>
             <jaxb:nameXmlTransform>
                <jaxb:typeName prefix="Type_"/>
                <jaxb:elementName prefix="Element_"/>
             </jaxb:nameXmlTransform>
          </jaxb:schemaBindings>
       </jaxb:bindings>
    </jaxb:bindings> 
    

    XJC 通话

    xjc -b binding.xml schema.xsd
    

    输出

    我们看到与全局元素对应的类以Element_为前缀,而与命名复杂类型对应的类以Type为前缀。 ObjectFactorypackage-info 不是域模型的一部分,它们被 JAXB 用于元数据,因此它们的名称不受影响。

    parsing a schema...
    compiling a schema...
    com/mycompany/hi/Element_GlobalElement.java
    com/mycompany/hi/ObjectFactory.java
    com/mycompany/hi/Type_NamedComplexType.java
    com/mycompany/hi/package-info.java
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 2011-05-17
    • 1970-01-01
    • 2018-12-08
    • 2019-03-28
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多