我有几个重用相同实体的XSD。例如,ProductPurchaseRequest.xsd
和ProductQuoteRequest.xsd
的 XSD 中都有一个 <product>
标记来描述有问题的产品。出于这个原因,我创建了一个Product.xsd
文件来定义<product>
标签,ProductPurchaseRequest.xsd
和ProductQuoteRequest.xsd
都Product.xsd
导入带有'.
我想使用 Castor 从这些 XSD 生成 Java 类,并且它们都使用相同的类来表示Product
,以便我可以重用相同的逻辑将它们映射到我们模型的 ProductModel
类。
蓖麻能做到这一点吗?如果是这样,它的 Ant 任务语法是什么。如果没有,也许JAXB会是更好的选择吗?
注意:我是 EclipseLink JAXB (MOXy( 的负责人,也是 JAXB 2 (JSR-222( 专家组的成员。
蓖麻能做到这一点吗?如果是这样,它的 Ant 任务语法是什么。 如果没有,也许JAXB会是更好的选择吗?
下面是如何使用 JAXB 完成此操作的示例:
产品
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/Product"
xmlns:tns="http://www.example.org/Product"
elementFormDefault="qualified">
<element name="product">
<complexType>
<sequence>
<element name="id" type="string"/>
<element name="name" type="string"/>
</sequence>
</complexType>
</element>
</schema>
由于多个 XML 模式导入 Product.xsd,我们可以利用剧集文件,以便与 Product.xsd 对应的类只生成一次。
xjc -d out -episode product.episode Product.xsd
产品购买请求.xsd
下面是导入 Product.xsd 的 XML 架构的示例:
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/ProductPurchaseRequest"
xmlns:tns="http://www.example.org/ProductPurchaseRequest"
xmlns:prod="http://www.example.org/Product"
elementFormDefault="qualified">
<import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
<element name="purchase-request">
<complexType>
<sequence>
<element ref="prod:product" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</schema>
当我们从这个 XML 模式生成类时,我们将引用我们在从 Product.xsd 生成 Java 类时创建的剧集文件。
xjc -d out ProductPurchaseRequest.xsd -extension -b product.episode
产品报价请求.xsd
下面是导入 Product.xsd 的 XML 架构的另一个示例:
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/ProductQuoteRequest"
xmlns:tns="http://www.example.org/ProductQuoteRequest"
xmlns:prod="http://www.example.org/Product"
elementFormDefault="qualified">
<import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
<element name="quote">
<complexType>
<sequence>
<element ref="prod:product"/>
</sequence>
</complexType>
</element>
</schema>
同样,当我们从此 XML 模式生成类时,我们将引用从 Product.xsd 生成 Java 类时创建的剧集文件。
xjc -d out ProductQuoteRequest.xsd -extension -b product.episode
欲了解更多信息
- http://weblogs.java.net/blog/kohsuke/archive/2006/09/separate_compil.html
我能够使用 JAXB 参考实现使整个事情正常工作。诀窍是意识到从JAXB站点下载的是下载器,而不是实际的库!双击以接受许可证,库将在本地下载。创建了一个测试文件夹(JAXB_TEST
(,并将所有下载的.jar
复制到lib
子文件夹中。我把所有的XSD放在XSD
子文件夹中。之后,我运行了以下 Ant build.xml
文件。
<?xml version="1.0"?>
<project name="jaxb_test" basedir="." default="package" >
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath>
<fileset dir="./lib" includes="*.jar" />
</classpath>
</taskdef>
<target name="generate">
<delete dir="./gen-src" />
<mkdir dir="./gen-src" />
<xjc destdir="./gen-src" language="XMLSCHEMA" package="com.mmm" >
<schema dir="./xsd" includes="EPC*.xsd" />
</xjc>
</target>
<target name="compile" depends="generate" >
<delete dir="./bin" />
<mkdir dir="./bin" />
<javac srcdir="./gen-src" destdir="./bin" includeantruntime="false" />
</target>
<target name="package" depends="compile" >
<delete dir="./dist" />
<mkdir dir="./dist" />
<jar destfile="./dist/jaxb-gen.jar" basedir="./bin" />
</target>
</project>
我遇到的唯一问题是我有一个带有一个名为 <product>
的根标签的 xsd,该匿名扩展了Product
类型以添加一个 version
属性(我一直喜欢在我的根标签上拥有该属性(,这导致了 JAXB 的名称冲突。因此,我将匿名类型转换为命名类型(即 TopLevelProduct
(并将根设置为该类型,JAXB 对此感到满意。