【问题标题】:generate java classes from xsd with mutlitlevel imports使用多级导入从 xsd 生成 java 类
【发布时间】:2016-11-18 17:00:46
【问题描述】:

我正在尝试使用 JAXB 插件从 xsd 生成 java 类,但无法获得我想要的效果。 我的用例是:

a.xsd 有一些元素。 b.xsd 有一些元素。

composite.xsd 需要包含来自“a.xsd”和“b.xsd”的一些元素以及它自己的元素。

到目前为止,我已经尝试了很多选择。我可以将 xsds( a 和 b )导入“复合”,但这只会使我能够将“a”和“b”中的元素用于“复合”xsd,但是当我使用 jaxb 生成类时,它不会自动从“a 和 b”中提取所有内容。 例如:

a.xsd -> has "name" element.
b.xsd -> has "phone" element.
composite.xsd -> imports a and b and has "nickname" element. 

因此,如果我没有在 Composite.xsd 中明确使用“name”和“phone”,生成的 java 类将不会生成它们。也可能有多级导入(像 Composite.xsd 这样的继承包括 "b.xsd" 和 "b.xsd" 包括 "a.xsd )。

所以我希望复合在生成的类中包含来自“a”和“b”的所有元素,而无需在复合.xsd 中显式重复 a.xsd 和 b.xsd 的元素。

期望的输出:

composite.class
name, phone, nickname. 

请指教。

以下是 xsd 详细信息的更多详细信息: (字段名称与我在原始问题中输入的名称不同,但会给出一个要点。)。

**a.xsd**
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Customer">
  <xsd:sequence>
    <xsd:element name="name" type="xsd:string" />
  </xsd:sequence>
</xsd:complexType>
</xsd:schema>

**b.xsd**
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Payments">
  <xsd:sequence>
    <xsd:element name="amount" type="xsd:float" />
  </xsd:sequence>
</xsd:complexType>
</xsd:schema>


**composite.xsd**

<xsd:include schemaLocation="x.xsd" />
<xsd:include schemaLocation="y.xsd" />

<xsd:complexType name="CustomerPayments">
<xsd:sequence>
  <xsd:element name="customer" type="Customer" />
  <xsd:element name="payments" type="Payments" />
</xsd:sequence>
</xsd:complexType>

</xsd:schema>

有了上面的 xsds,我想要实现的是有一个复合 java 类(由 JAXB maven 插件生成)从导入/包含的 xsds 中自动具有“名称”和“金额”等字段。

【问题讨论】:

  • 发布您的 XSD,以及迄今为止您尝试过的内容。这将有助于解决问题
  • 当然,刚刚添加了示例 xsd sn-ps。

标签: java maven xsd jaxb


【解决方案1】:

生成的CustomerPayments类将不包含属性nameamount,这不是XJC的工作方式。

但它将包含customerpayments 类型的字段CustomerPayments,它们将分别包含属性nameamount。所以你可以在最后做customerPayments.getCustomer().getName()

【讨论】:

  • 感谢 Lexicore 的建议。欣赏它。看起来我必须考虑其他一些选项,不知何故,我的用例需要将所有字段从父 xsd 导入/继承到子 xsd ...(生成的 java 类)。
  • @Sacs 为什么需要一个类中的所有字段?
  • 基本上我们有一堆项目,其中一些使用 xsd 生成 pojo,有些不使用,但不使用的那些手动创建了 java 类(POJO),并重复了很多使用 xsd 生成的 pojos 的旧项目中已经存在的字段。作为第一步,要开始以最小的影响简化这些,我尝试使用 xsds 来生成 pojo,以避免手动生成 pojo。为了实现这些,我正在考虑拥有 xsd 继承(一种),拥有来自其他 xsd 的所有字段,这些字段已经存在,并在其之上添加任何特定的内容。
  • @Sacs XSD “继承”,正如您所说,与“一个类中的所有字段”无关。如果您有模式包含和导入、类型扩展或限制,那么所有这些都适用于 JAXB/XJC。试图将所有字段放在一个类中并不是因为它没有意义。模式允许复杂的结构,您不能通过将所有字段放在一个类中来表示这些结构。你解决了错误的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2015-06-28
  • 2020-10-27
相关资源
最近更新 更多