我希望将多个模式转换为 Java 代码。这些模式都是相似的;例如,每个都有一个 TXLife 根对象。如果每个模式生成具有唯一类名的代码,那么管理代码会更容易。我可以使用“package”绑定(bind)将每个模式中的代码放入其自己的包中,但是当我尝试使用“prefix”绑定(bind)来更改类名称时,它会忽略它。
这是我的 schema_bindings.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="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 文件内的类路径才能使其正常工作):
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_
我可以使用这些结果,但这意味着处理来自一个模式的输入并向另一个模式生成输出的代码必须使用完全限定的类名来引用对象,这很尴尬。
最佳答案
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>
绑定(bind).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
。 ObjectFactory
和package-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
关于java - JAXB 问题 : nameXmlTransform typeName prefix not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685003/