XSD元素定义具有相同的名称,但属性不同

时间:2012-11-06 00:54:12

标签: xml xsd jaxb

我有一个有趣的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选择在编组时使用哪个结果元素。

... 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,而不是搜索正确的实现。

有什么方法可以避免这种情况吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

由于xml在没有来自webservice的命名空间的情况下进入,我使用JDom来设置命名空间,因为我知道目标对象类型在运行时将是什么。

希望这有助于任何有兴趣的人。