Java jaxb重写特定生成的类集的包
我有一个很大的第三方xsd文件,它通过导入拉入一大堆其他xsd文件。整个过程产生了1000多个类。当我告诉xjc(jaxb)处理器生成特定包中的所有内容时,我会遇到各种命名冲突。如果我没有指定包,那么处理器使用xsd文件中的目标属性创建java包,整个过程生成时不会出现任何错误 问题是包结构很糟糕,因为目标名称的选择非常糟糕。其他开发者讨厌它。他们只需要几节课 所以我一直在尝试给处理器一个bindings.xml文件,我想在其中指定要在给定包名中生成的某些类。 我在Oracle网站上的文档、论坛和示例之间来回切换。我不能引用绑定文件的每一次迭代。我现在的化身是:Java jaxb重写特定生成的类集的包,java,xsd,jaxb,Java,Xsd,Jaxb,我有一个很大的第三方xsd文件,它通过导入拉入一大堆其他xsd文件。整个过程产生了1000多个类。当我告诉xjc(jaxb)处理器生成特定包中的所有内容时,我会遇到各种命名冲突。如果我没有指定包,那么处理器使用xsd文件中的目标属性创建java包,整个过程生成时不会出现任何错误 问题是包结构很糟糕,因为目标名称的选择非常糟糕。其他开发者讨厌它。他们只需要几节课 所以我一直在尝试给处理器一个bindings.xml文件,我想在其中指定要在给定包名中生成的某些类。 我在Oracle网站上的文档、论坛
<jaxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1"
schemaLocation="heavy.xsd"
node="//xsd:element[@name='Error']"
>
<jaxb:bindings node="//xsd:element[@name='Error']">
<jaxb:package name="ABC"/>
</jaxb:bindings>
<jaxb:globalBindings
underscoreBinding="asCharInWord"
localScoping="toplevel"
typesafeEnumMaxMembers="10000"
generateElementClass="true"
>
</jaxb:globalBindings>
<!--
<jaxb:package name="ABC"/>
-->
<!--
<jaxb:schemaBindings>
<jaxb:package name="ABC"/>
</jaxb:schemaBindings>
-->
<!--
<jaxb:schemaBindings>
<jaxb:package name="ABC"/>
<jaxb:nameXmlTransform>
<jaxb:elementName prefix="Error"/>
</jaxb:nameXmlTransform>
</jaxb:schemaBindings>
-->
</jaxb:bindings>
无论我尝试了什么,我还没有看到它在ABC包中生成任何类。在这种情况下,我希望在ABC中生成错误。任何帮助都将不胜感激。这里是bindings.xjb文件的一个示例,其中java源代码在primer.myPo包中生成
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="po.xsd" node="/xs:schema">
<jxb:globalBindings
fixedAttributeAsConstantProperty="false"
collectionType="java.util.Vector"
typesafeEnumBase="xs:NCName"
choiceContentProperty="false"
typesafeEnumMemberName="generateError"
enableFailFastCheck="false"
generateIsSetMethod="false"
underscoreBinding="asCharInWord"/>
<jxb:schemaBindings>
<jxb:package name="primer.myPo">
<jxb:javadoc><![CDATA[<body>Package level documentation for generated package primer.myPo.</body>]]>
</jxb:javadoc>
</jxb:package>
<jxb:nameXmlTransform>
<jxb:elementName suffix="Element"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>
<jxb:bindings node="//xs:complexType[@name='PurchaseOrderType']">
<jxb:class name="POType">
<jxb:javadoc>A <b>Purchase Order</b> consists of addresses and items.</jxb:javadoc>
</jxb:class>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='USAddress']">
<jxb:class>
<jxb:javadoc><![CDATA[First line of documentation for a <b>USAddress</b>.]]></jxb:javadoc>
</jxb:class>
<jxb:bindings node=".//xs:element[@name='name']">
<jxb:property name="toName"/>
</jxb:bindings>
<jxb:bindings node=".//xs:element[@name='zip']">
<jxb:property name="zipCode"/>
</jxb:bindings>
</jxb:bindings> <!-- node="//xs:complexType[@name='USAddress']" -->
<jxb:bindings node="//xs:complexType[@name='Items']">
<jxb:bindings node=".//xs:element[@name='item']//xs:element[@name='quantity']">
<jxb:property generateIsSetMethod="true"/>
<jxb:bindings node="./xs:simpleType">
<jxb:javaType name="short"
parseMethod="javax.xml.bind.DatatypeConverter.parseShort"
printMethod="javax.xml.bind.DatatypeConverter.printShort" />
</jxb:bindings>
</jxb:bindings> <!-- node="//xs:complexType[@name='Items']" -->
<jxb:bindings node=".//xs:element[@name='USPrice']">
<jxb:property name="Price"/>
</jxb:bindings>
<jxb:bindings node=".//xs:attribute[@name='partNum']">
<jxb:property name="partNumber"/>
</jxb:bindings>
</jxb:bindings>
<jxb:bindings node="//xs:simpleType[@name='USState']">
<jxb:typesafeEnumClass/>
</jxb:bindings>
<jxb:bindings node="//xs:simpleType[@name='ZipCodeType']">
<jxb:javaType name="int"
parseMethod="javax.xml.bind.DatatypeConverter.parseInt"
printMethod="javax.xml.bind.DatatypeConverter.printInt"/>
</jxb:bindings>
</jxb:bindings> <!-- schemaLocation="po.xsd" node="/xs:schema" -->
</jxb:bindings>
生成的Package primer.myPo的包级文档。]]>
A b>采购订单/b>由地址和项目组成。
美国地址。]]>
我会这样做:
<?xml version="1.0" encoding="utf-8"?>
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1" jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="XSD1.xsd" node="/xs:schema">
<jxb:globalBindings>
<!-- -->
</jxb:globalBindings>
<jxb:schemaBindings xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
<jxb:package name="com.something">
</jxb:package>
</jxb:schemaBindings>
<jxb:bindings node="//xs:element[@name='Error']">
<jxb:class xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" name="MyError"/>
<jxb:property xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" name="Whatever"/>
</jxb:bindings>
</jxb:bindings>
<jxb:bindings schemaLocation="XSD2.xsd" node="/xs:schema">
<jxb:schemaBindings xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
<jxb:package name="com.somethingelse">
</jxb:package>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
不幸的是,你不可能做你想做的事。我想要同样的东西,我也在同一条船上。但直接从神谕的口中: 相关信息: name-派生Java接口的名称。它必须是合法的Java接口名称,并且不能包含包前缀。包前缀继承自包的当前值
因此,元素上根本没有办法指定它根据xsd继承的不同包。为什么要复制
xmlns:xjc=”http://java.sun.com/xml/ns/jaxb/xjc“
跨XML?把它放到根元素不是更容易吗?代码段来自一个绑定文件,该文件是由工具自动生成的,因此使用了XML名称空间。如果我正确理解了这个绑定文件,它会告诉从XSD1.xsd生成的所有java文件都在com.something包中,并将错误类重命名为MyError,以及com.somethingelse包中从XSD2.xsd生成的所有java文件。对吗?但我想弄明白的是,如何将一个特定的元素放在一个特定的包中,而所有其他元素都放在它们的正常包名中。我需要覆盖一个特定元素。是的,你的理解是正确的。我不知道如何控制单个类的包名。在您的情况下,如果我必须这样做(免责声明:我在这里对我使用的工具有偏见),我会做的是在一个单独的XSD文件中隔离我想要的特定java包中的任何内容—实际上引入一个或多个s。这样,如果你需要让它工作的话,它会工作的。此外,在这个过程中,我使用的同一个工具将能够删除任何未使用的XSD内容(由您的实现确定范围),从而减少类不是每个人都可以控制XSD。如果你分析它们,它们将来可能会改变。我在寻找相同的答案。我认为这会使po.xsd在primer.myPro包中为任何以元素名称结尾的元素生成内容?其次,它将该类从名为PurchaseOrderType的complexType重命名为POType作为其新类名。我还发现了如何重命名特定的类。如果有一种方法可以让这个类在一个特定的包中运行,这就是我想要的。我没有得到剩下的部分。它基于xpath匹配的元素、属性和SimpleType设置属性?那又怎样?这不是他的问题的答案。他想将一个特定的元素映射到一个差异包,而不是通过xsd。如果您找到了任何方法,我对您的解决方案感兴趣。