从 xsd 生成代码,结果 类 名称中的 replace/remove 后缀
Generate code from xsd, replace/remove suffix in name of resulting Classes
所以我得到了 XSD(超出我的控制),我使用 Maven jaxb2 插件(版本 0.13.0)从中生成 java 源,其中每个复杂类型都有后缀“结构”,例如“Connection”元素属于复杂类型“ConnectionStructure”。我真的很想从代码中删除这些,因此生成的 class 不称为 ConnectionStructure,而是“Connection”。
我已阅读 here,其中详细介绍了如何重命名单个 class。
因此,我的代码是
<bindings schemaLocation="MyXsd.xsd">
<schemaBindings>
<package name="mypackage.generated.a" />
</schemaBindings>
<bindings node="//xsd:complexType[@name='*ConnectionStructure']">
<class name="Connection"/>
</bindings>
<bindings
但我不仅想从 ConnectionStructure 中删除后缀,而且还想从每个以 structure.I 结尾的 class 中删除后缀,但我还没有完全找到如何使用通配符或其他任何东西实现此目的就这样。
如有任何帮助,我们将不胜感激!
据我所知,没有绑定可以以这种方式工作。有一些绑定可以为生成的名称添加前缀和后缀,但不能删除它们。 :)
我看到有几个解决方法:
- 正如 VGR 所建议的,您可以编写一个 XSLT,它从架构中生成一个绑定文件。如果模式简单明了,这可能会很容易。但如果模式更复杂(导入、内部类型等),它会变得非常混乱。我为模式处理写了很多 XSLT,这可能很难。
- 编写一个 XJC 插件来重命名模型 classes。这可能很难,XJC 内部非常复杂。 (我会这样做,但我在编写 XJC 插件方面有相对较好的经验。)
- 在构建过程中使用一些自动重构工具重命名一堆文件。像 JRefactory 这样的东西。
- 或者简单地重命名适当的文件并替换其他文件中相应的 class 名称。
更新:
我有了另一个想法:
XJC 还可以生成 so-called 剧集文件,它本质上是一个绑定文件,其中包含所有模式类型的绑定。因此,您可以编写一个 XSLT 并将其应用于生成的绑定文件,而不是将 XSLT 应用于模式——并将其用于下一代。举个例子,剧集文件如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" if-exists="true" version="2.1">
<bindings xmlns:tns="http://www.opengis.net/wms" if-exists="true" scd="x-schema::tns">
<schemaBindings map="false">
<package name="net.opengis.wms.v_1_3_0"/>
</schemaBindings>
<bindings if-exists="true" scd="tns:WMS_Capabilities">
<class ref="net.opengis.wms.v_1_3_0.WMSCapabilities"/>
</bindings>
<bindings if-exists="true" scd="tns:Service">
<class ref="net.opengis.wms.v_1_3_0.Service"/>
</bindings>
<bindings if-exists="true" scd="tns:KeywordList">
<class ref="net.opengis.wms.v_1_3_0.KeywordList"/>
</bindings>
<bindings if-exists="true" scd="tns:Keyword">
<class ref="net.opengis.wms.v_1_3_0.Keyword"/>
</bindings>
<!-- ... -->
</bindings>
</bindings>
因此,编写一个 XSLT 来生成您需要的绑定文件非常简单。这绝对比为模式编写 XSLT 容易得多。
所以我得到了 XSD(超出我的控制),我使用 Maven jaxb2 插件(版本 0.13.0)从中生成 java 源,其中每个复杂类型都有后缀“结构”,例如“Connection”元素属于复杂类型“ConnectionStructure”。我真的很想从代码中删除这些,因此生成的 class 不称为 ConnectionStructure,而是“Connection”。
我已阅读 here,其中详细介绍了如何重命名单个 class。
因此,我的代码是
<bindings schemaLocation="MyXsd.xsd">
<schemaBindings>
<package name="mypackage.generated.a" />
</schemaBindings>
<bindings node="//xsd:complexType[@name='*ConnectionStructure']">
<class name="Connection"/>
</bindings>
<bindings
但我不仅想从 ConnectionStructure 中删除后缀,而且还想从每个以 structure.I 结尾的 class 中删除后缀,但我还没有完全找到如何使用通配符或其他任何东西实现此目的就这样。
如有任何帮助,我们将不胜感激!
据我所知,没有绑定可以以这种方式工作。有一些绑定可以为生成的名称添加前缀和后缀,但不能删除它们。 :)
我看到有几个解决方法:
- 正如 VGR 所建议的,您可以编写一个 XSLT,它从架构中生成一个绑定文件。如果模式简单明了,这可能会很容易。但如果模式更复杂(导入、内部类型等),它会变得非常混乱。我为模式处理写了很多 XSLT,这可能很难。
- 编写一个 XJC 插件来重命名模型 classes。这可能很难,XJC 内部非常复杂。 (我会这样做,但我在编写 XJC 插件方面有相对较好的经验。)
- 在构建过程中使用一些自动重构工具重命名一堆文件。像 JRefactory 这样的东西。
- 或者简单地重命名适当的文件并替换其他文件中相应的 class 名称。
更新:
我有了另一个想法:
XJC 还可以生成 so-called 剧集文件,它本质上是一个绑定文件,其中包含所有模式类型的绑定。因此,您可以编写一个 XSLT 并将其应用于生成的绑定文件,而不是将 XSLT 应用于模式——并将其用于下一代。举个例子,剧集文件如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" if-exists="true" version="2.1">
<bindings xmlns:tns="http://www.opengis.net/wms" if-exists="true" scd="x-schema::tns">
<schemaBindings map="false">
<package name="net.opengis.wms.v_1_3_0"/>
</schemaBindings>
<bindings if-exists="true" scd="tns:WMS_Capabilities">
<class ref="net.opengis.wms.v_1_3_0.WMSCapabilities"/>
</bindings>
<bindings if-exists="true" scd="tns:Service">
<class ref="net.opengis.wms.v_1_3_0.Service"/>
</bindings>
<bindings if-exists="true" scd="tns:KeywordList">
<class ref="net.opengis.wms.v_1_3_0.KeywordList"/>
</bindings>
<bindings if-exists="true" scd="tns:Keyword">
<class ref="net.opengis.wms.v_1_3_0.Keyword"/>
</bindings>
<!-- ... -->
</bindings>
</bindings>
因此,编写一个 XSLT 来生成您需要的绑定文件非常简单。这绝对比为模式编写 XSLT 容易得多。