我有几个重用相同实体的XSD。例如,ProductPurchaseRequest.xsd
和ProductQuoteRequest.xsd
的XSD都有<product>
标记,用于描述相关产品。出于这个原因,我创建了一个Product.xsd
文件来定义<product>
标记,ProductPurchaseRequest.xsd
和ProductQuoteRequest.xsd
都用{。}导入Product.xsd
。
我想使用Castor从这些XSD生成Java类,并且两者都使用相同的类来表示Product
,这样我就可以重用相同的逻辑将它们映射到我们的模型{ {1}}上课。
Castor可以这样做吗?如果是这样,它的Ant任务语法是什么。如果没有,或许JAXB可能是更好的选择吗?
答案 0 :(得分:6)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。
Castor可以这样做吗?如果是这样,它的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
<强> ProductPurchaseRequest.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
<强> ProductQuoteRequest.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
了解更多信息
答案 1 :(得分:1)
所以我能够使用JAXB参考实现完成所有工作。诀窍是要意识到JAXB site的下载是下载程序而不是实际的库!双击以接受许可证,库将在本地下载。创建了一个测试文件夹(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对此感到满意。