10

如果我有扩展,如何确保派生元素位于基类元素之前?默认值是相反的。我很想使用all,但我知道这是不可能的。

<xs:complexType name="BaseClass">
  <xs:sequence>
    <xs:element name="foo" type="xs:string/>
    <xs:element name="bar" type="xs:string/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="DerivedClass">
  <xs:complexContent>
    <xs:extension base="BaseClass">
      <xs:sequence>
        <!-- This makes the order foo, bar, cheese, tomato -->
        <!-- But I need cheese, tomato, foo, bar -->
        <xs:element name="cheese" type="xs:string/>
        <xs:element name="tomato" type="xs:string/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:element name="BaseClass" type="BaseClass"/>
<xs:element name="DerivedClass" type="DerivedClass" substitutionGroup="BaseClass"/>

我希望被接受的 xml 看起来像这样:

<mylist>
    <BaseClass>
     <foo>lala</foo>
     <bar>lala</bar>
    </BaseClass>
    <DerivedClass>
     <cheese>cheddar</cheese>
     <tomato>red</tomato>
     <foo>lala</foo>
     <bar>lala</bar>
    </DerivedClass>
</mylist>

目前我正在考虑将所有元素也复制BaseClassDerivedClass,但我不知道替换组会发生什么以及不会发生什么。

4

3 回答 3

10

如果我有扩展,如何确保派生元素位于基类元素之前?

不幸的是,这是不可能的。扩展 complexType 时,新元素将作为序列添加到基本元素中。基本上,新的内容模型如下所示:

(base element model), (extension element model)

这就是 XSD 中类型扩展的工作方式。你可能想知道为什么?因为扩展类型必须符合基类型。你不能有任何东西作为任何东西的延伸作为基础。

假设您有一个知道如何处理类型 A 元素的软件。该软件可能假设实际上类型 A 可以扩展,但无论如何,它必须能够在应该是类型 A 的元素中找到它的所有内容知道/期望来自 A 型......并且 A 型固有的元素内容(这是最重要的事情之一)必须排在第一位!

于 2013-09-17T14:18:13.300 回答
3

解决这个问题的唯一方法是使用组,它可以插入到序列中的任何位置。但是,使用这种方法,您不能使用substitutionGroup.

<xs:group name="BaseGroup">
  <xs:sequence>
    <xs:element name="foo" type="xs:string"/>
    <xs:element name="bar" type="xs:string"/>
  </xs:sequence>
</xs:group>
<xs:complexType name="BaseClass">
  <xs:group ref="BaseGroup"/>
</xs:complexType>
<xs:complexType name="DerivedClass">
  <xs:sequence>
    <xs:element name="cheese" type="xs:string"/>
    <xs:element name="tomato" type="xs:string"/>
    <xs:group ref="BaseGroup"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="BaseClass" type="BaseClass"/>
<xs:element name="DerivedClass" type="DerivedClass"/>
于 2019-05-15T08:35:56.570 回答
0

在验证 PHP 生成的 XML 时,我遇到了同样的问题。

就是我解决它的方法。基本上,

  1. 遍历所有 php 类属性,
  2. 将当前类中的内容推送到一个数组中,
  3. 将父类中的内容推送到另一个数组中。
  4. 将当前类属性合并到父类属性的末尾
  5. 从重新排序的属性数组生成 XML
于 2016-06-12T17:15:00.477 回答