使用 JAXB 2.1 实现(Metro、EclipseLink MOXy、Apache JaxMe 等),您可以指定模式类型对应于现有类以防止生成它们。
例如:
根.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root">
<xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/>
<xsd:complexType name="root">
<xsd:attribute name="root-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
导入的.xsd
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/imported"
targetNamespace="http://www.example.com/imported">
<xsd:complexType name="imported">
<xsd:attribute name="imported-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
问题陈述
如果您使用 XJC 工具从 XML 模式生成 java 类:
xjc -d out root.xsd
您将生成以下内容:
com\example\imported\Imported.java
com\example\imported\ObjectFactory.java
com\example\imported\package-info.java
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
导入的绑定.xml
您可以使用 JAXB 绑定文件来指定 import.xsd 中的类型指向现有类:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="imported.xsd">
<jxb:bindings node="//xs:complexType[@name='imported']">
<jxb:class ref="com.example.imported.Imported"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
运行 XJC
现在,如果我们在没有绑定文件的情况下运行 XJC:
xjc -d out -b imported-bindings.xml root.xsd
将不会生成绑定文件中指定的任何文件:
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
替代方法
从导入的模式直接(xjc import.xsd)和间接(xjc root.xsd)生成的代码是相同的。您可以简单地删除间接生成的代码并指向包含直接生成的代码的项目。