JAXB问题:nameXmlTransform typeName前缀不起作用 [英] Issue with JAXB: nameXmlTransform typeName prefix not working
问题描述
我希望将几个模式转换为Java代码。模式都很相似;例如,每个人都有一个TXLife根对象。如果每个模式生成具有唯一类名的代码,则管理代码会更容易。我可以使用package绑定将每个模式的代码放入自己的包中,但是当我尝试使用prefix绑定来更改类名时,它会忽略它。
I wish to convert several schemas into Java Code. The schemas are all similar; for example, each one has a TXLife root object. It would be easier to manage the code if each schema generated code with unique class-names. I can use the "package" binding to put the code from each schema into its own package, but when I try to use the "prefix" binding to change the class names, it ignores it.
这是我的schema_bindings.xml文件:
Here is my schema_bindings.xml file:
<?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="schemas/HI_Request.xsd" node="/xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="com.mycompany.hi"/>
<jaxb:nameXmlTransform>
<jaxb:typeName prefix="Hi_"/>
</jaxb:nameXmlTransform>
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>
当我运行xjc命令时,我得到(我必须修改xjc.bat文件中的类路径才能使其工作):
When I run the xjc command I get (I had to modify the classpath inside the xjc.bat file in order to get it to work):
C:\ test> \progs\Java\jaxb-ri-2.2.7 \ bin \ xjc。 bat -extension -d src -b schema_bindings.xml schemas
C:\test>\progs\Java\jaxb-ri-2.2.7\bin\xjc.bat -extension -d src -b schema_bindings.xml schemas
parsing a schema...
compiling a schema...
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_< name>。 Jaxb似乎完全忽略了我的前缀规范。
我在绑定文件上尝试了几种变体。我也尝试使用Ant xjc任务进行相同的绑定,所有结果都相同。
What I was hoping for is that each java file (and the class inside) would be named "Hi_<name>". Jaxb seems to be completely ignoring my "prefix" specification. I have tried several variations on the bindings file. I have also tried the same bindings using the Ant xjc task, all with the same results.
我可以使用这些结果,但这意味着处理输入的代码从一个模式生成输出到另一个模式必须使用完全限定的类名来引用对象,这很尴尬。
I can work with these results, but it would mean that code that processes input from one schema and produces output to another schema would have to use fully-qualified class names to refer to the objects, which is awkward.
推荐答案
TL; DR
< jaxb:typeName prefix =Hi _/>
对应于从命名复杂类型生成的类。您可以通过添加< jaxb:elementName prefix =Hi _/>
来影响从全局元素生成的类:
TL;DR
<jaxb:typeName prefix="Hi_"/>
corresponds to the classes generated from named complex types. You could do the following by adding <jaxb:elementName prefix="Hi_"/>
to affect the classes generated from global elements:
<?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>
完整示例
以下是一个完整的示例。
Full Example
Below is a complete example.
schema.xsd
下面的架构有一个全局元素和一个命名的复杂类型。
The schema below has a global element and a named complex type.
<?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
输出
我们看到对应于全局元素的类前缀为元素_
与指定的复杂类型对应的类以 Type
为前缀。 ObjectFactory
和 package-info
不是域模型的一部分,JAXB利用它来获取元数据,因此它们的名称不是受影响。
We see that the class corresponding to the global element was prefixed with Element_
and the class corresponding to the named complex type was prefixed with Type
. ObjectFactory
and package-info
are not part of the domain model and are leveraged by JAXB for metadata so their names were not affected.
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
这篇关于JAXB问题:nameXmlTransform typeName前缀不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!