1

我有一个 XML 模式,它定义了一堆复杂的类型,它们是各种命令、响应和事件。

作为一个特定示例,我有一个 Response 复杂类型,它由所有响应共有的元素组成,无论类型如何。然后,我有各种特定类型的响应。除了 Response 复杂类型中的元素之外,一些响应不会添加任何其他元素,而另一些则非常复杂,并且包含可能复杂或简单的各种其他元素:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:Command" targetNamespace="urn:Command" elementFormDefault="qualified" version="0.0.5.0">
    <xs:complexType name="Response">
        <xs:annotation>
                <xs:documentation>...</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element ref="commandID"/>
            <xs:element ref="responseToID"/>
            <xs:element ref="commandStatus"/>
            <xs:element ref="creationTime"/>
            <xs:element ref="completionTime"/>
        </xs:sequence>
</xs:complexType>
...
<xs:complexType name="SpecificResponse">
    <xs:annotation>
        <xs:documentation>...</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="Response"/>
    </xs:complexContent>
</xs:complexType>
...

当我收到一个包含响应的 xs:extension 以及许多其他字段的特定响应时,XML 实际上看起来像:

<Response xsi:type="SpecificResponse" xsi:schemaLocation="urn:Command {file path}" xmlns="urn:Response" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <commandID>...</commandID>
  <responseToID>...</responseToID>
  <commandStatus>...</commandStatus>
  <creationTime>...</creationTime>
  <completionTime>...</completionTime>
</Response>

当我在此 XML 上使用SpecificResponse.Factory.parse(...)orSpecificResponseDocument.Factory.parse(...)方法时,它会失败,因为“元素响应不是有效的 SpecificResponse 文档或有效的替换”。在这个特定的示例中,这并不是什么大问题——拥有一个 SpecificResponse 或 SpecificResponseDocument 的实例不会添加任何新的方法供我调用,因为所有字段都存在于两者中。但是,在 DifferentSpecificResponse 包含其他元素的情况下,这是有问题的。另外,当我将它们添加到可以包含任何扩展 Response 的任何内容的数据结构中时,我宁愿拥有更准确的类型信息。

完整的文档在外部工具中针对模式进行验证。尽管它具有 SpecificResponse 的所有元素(未在 Response 元素中定义),但具有 xsi:type 的 SpecificResponse 似乎使 XML 有效(这是一个不正确的假设吗?)。但是,看起来 XMLBeans 正在查看根元素,而不是我试图解析的 XML 的 xsi:type。

到目前为止,我找到的解决方案是使用 解析响应ResponseDocument.Factory.parse(...),然后在其上调用getResponse()函数,然后将其类型转换为适当的特定响应。这对我来说似乎很笨拙,但是一旦我完成了转换,我就可以使用 XMLBeans 访问器和修改器方法,以及它的类层次结构(这是我所期望的——SpecificResponse 是 Response 的子类)。有没有更好的方法来处理这个,假设消息的来源不能改变发送XML<SpecificResponse...并且必须继续发送<Response xsi:type="SpecificResponse"...

4

0 回答 0