【问题标题】:How to avoid huge Java Files when generating from XML Schema With Many Identical Element Names从具有许多相同元素名称的 XML 模式生成时如何避免巨大的 Java 文件
【发布时间】:2015-11-12 14:41:47
【问题描述】:

我正在使用一个非常大的 Web 服务模式(40,000 行和 5,000 个元素)编写一个 Web 服务客户端。此架构是外部提供的,即我无法更改它。

我使用 JAXB 为客户端生成 Java 类。默认情况下,所有类都生成到一个 Java 文件中,最终有 500,000 行。

这对我的 IDE (Eclipse) 来说是个大问题,即使有 4GB 内存,它也会挂起并崩溃。

我可以通过生成单独的 Java 文件来解决这个问题,但架构中的许多实体具有相同的名称。当所有 Java 类都生成在同一个包中时,会出现 500 多个名称冲突。

如果我要使用 jaxb 绑定来避免这些冲突,我将不得不手动编写超过 500 个绑定定义。

如果我能自动将 XML 层次结构映射到 java 包中会很方便,但我从来没有见过这样的例子。

我不能透露架构本身,但这里有一个小例子来说明问题:

<xs:element name="top">
    <xs:element name="customer">
        <xs:element name="name">
            ...
        </xs:element>
        <xs:element name="address">
            ...
        </xs:element>
        <xs:element name="employee">
            <xs:element name="name">
                ...
            </xs:element>
            <xs:element name="address">
                ...
            </xs:element>
        </xs:element>
    </xs:element>
    <xs:element name="provider">
        <xs:element name="product">
            <xs:element name="name">
                ...
            </xs:element>
        </xs:element>
        <xs:element name="name">
            ...
        </xs:element>
        <xs:element name="address">
            ...
        </xs:element>
    </xs:element>
</xs:element>

所需的结果是 Java 类,例如:

com.mycompany.generated.Top
com.mycompany.generated.top.Customer
com.mycompany.generated.top.customer.Name
com.mycompany.generated.top.customer.Address
com.mycompany.generated.top.customer.Employee
com.mycompany.generated.top.customer.employee.Name
com.mycompany.generated.top.customer.employee.Address
...
com.mycompany.generated.top.Provider
...

我怎样才能做到这一点?

编辑: 原始 xsd(与此处提供的 sn-p 不同)完全有效,但它单独定义了每个元素。例如。即使有许多称为地址的类型具有相同的定义,但每个类型都是在其元素标记之间定义的,而不是重新使用一个类型。这是它如此之大的原因之一,也是为什么有这么多相同的类。更复杂的是,我还发现了具有相同名称和不同细节的类型定义。

我不需要填写 WS 中的所有元素,所以我的主要目标是让代码生成成功且不费吹灰之力。

我不愿意在本地更改架构以重用类型定义,因为我预计上面的未来更改将需要一次又一次地应用相同的修改。

【问题讨论】:

  • 我现在能想到的唯一方法是编写一个脚本来手动梳理 XML,以便生成更小的类。您可以告诉我们有关架构的任何其他内容都会有所帮助,“它真的很大”并不是很多。
  • 解决办法是不使用JAXB。有些模式根本不适合。除此之外,非常大的模式也往往会更频繁地更改,因此您不仅会遇到编译大量 Java 代码的问题,而且还会对更改管理感到头疼。 JAXB 非常适合小型简单的稳定模式,但它无法扩展。

标签: java xml eclipse web-services jaxb


【解决方案1】:

您可以使用以下方法生成单独的 Java 类:

<jaxb:globalBindings localScoping="toplevel"/>

但是,这仍然会为您留下 500 个类名自定义项。您可以使用蛮力或编写一个 XJC 插件来处理它。我认为蛮力比写插件要快。

但是我不会在不同的包之间分配类。 JAXB 有许多包级功能,如果您在不同包之间分配相同命名空间的类,这些功能可能会失败/出错。所以我只会做&lt;jaxb:class name="CustomerName"/&gt; 自定义。

我还考虑编写一个 XSLT 转换,它会自动从模式中生成绑定文件。应该不难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多