1

我有一个有趣的 XML 情况,我正在尝试为其编写 XSD。我正在使用的 Web 服务有一种不同寻常的发送响应的方式,因为它在某种程度上是通用的。

例如,

网络服务调用 1:

<rootElement>
  <result>
    <resultset>
      <row attr="some value" attr2="some value 2" />
    </resultset>
  </result>
</rootElement>

网络服务调用 2:

<rootElement>
  <result>
    <resultset>
      <row someOtherAttr="some value" someOtherAttr2="some value 2" />
    </resultset>
  </result>
</rootElement>

如您所见,唯一区分两个 Web 服务响应的是行元素中的属性。

我已经尝试了几种不同的方法,通过为结果元素设置一个抽象元素,这在一定程度上起作用,但我不知道如何允许 JAXB 在编组时选择要使用的结果元素。

IE

... other xs declarations excluded for sanity ...
<xs:element ref="abstractResult" />
... snip ...

<xs:element name="abstractResult" type="ResultType" abstract="true" />

<xs:complexType name="ResultType" abstract="true" />

<xs:complexType name="SomeResultType">
  <xs:complexContent>
    <xs:extension base="ResultType">
... snip ...

这种方法的问题是 JAXB 在编组而不是搜索适当的实现时尝试实例化抽象 ResultType。

有没有办法避免这种情况?

非常感谢!

4

1 回答 1

0

最终将模式分成独立的文件,其中有根元素的不同实现。

然后,我将多个模式绑定到它们自己的命名空间,以便编组器能够区分相似的元素。

由于 xml 没有来自 web 服务的命名空间,因此我使用 JDom 设置命名空间,因为我知道目标对象类型在运行时将是什么。

希望这可以帮助任何感兴趣的人。

于 2012-11-06T21:55:06.643 回答