gpt4 book ai didi

java - 从具有许多相同元素名称的 XML 模式生成时如何避免巨大的 Java 文件

转载 作者:行者123 更新时间:2023-12-01 10:54:45 25 4
gpt4 key购买 nike

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

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

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

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

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

如果我能够自动将 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(与此处提供的代码片段不同)完全有效,但它单独定义了每个元素。例如。尽管有许多称为地址的类型具有相同的定义,但每个类型都是在其元素标记之间定义的,而不是重复使用类型。这就是它如此之大以及有如此多相同类的原因之一。更复杂的是,我还发现了具有相同名称和不同细节的类型定义。

我不需要填充 WS 中的所有元素,因此我的主要目标是顺利生成代码。

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

最佳答案

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

<jaxb:globalBindings localScoping="toplevel"/>

但是这仍然给您留下了 500 个类名自定义项。您可以使用暴力破解或编写 XJC 插件来处理该问题。我认为暴力破解会比编写插件更快。

但是我不会在不同的包之间分配类。 JAXB 有许多包级功能,如果您在不同的包之间分发相同 namespace 的类,这些功能可能会失败/出错。所以我就这样做<jaxb:class name="CustomerName"/>自定义。

我还考虑编写一个 XSLT 转换,它将自动从架构中生成绑定(bind)文件。应该不难。

关于java - 从具有许多相同元素名称的 XML 模式生成时如何避免巨大的 Java 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com