0

我相信已经理解了这篇文章中的所有内容,但我似乎还有一些工作要做。

如果我的类中有一个简单的继承树:

A (abstract)
^
B
^
C

我想在我的 xml 中有一个简单的对象列表,如下所示:

<mylist>
    <B>lalala</B>
    <C>fofofo</C>
    <C>fofofo</C>
    <C>fofofo</C>
    <C>fofofo</C>
    <B>lalala</B>
</mylist>

当我尝试验证此方案时,它似乎不起作用:

<xs:schema>
    <xs:complexType name="A" abstract="true">
        <xs:element name="text" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="B">
        <xs:complexContent>
            <xs:extension base="A"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="C">
        <xs:complexContent>
            <xs:extension base="B"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="mylist>
        <xs:sequence maxOccurs="unbounded">
            <xs:element name="A" type="A"/>
        </xs:sequence>
    </xs:element>
</xs:schema>

请记住,这只是为了没有很多命名空间的短 xml 的伪代码。

为什么验证器告诉我(例如记事本++)它仍然期待 an<A>而不是 a<B>或 a <C>

4

1 回答 1

1

你越来越近了。但是您将元素名称与类型名称混为一谈。类型 B 和 C 可以替代类型 A,但是您根本没有声明任何名为 B 和 C 的元素,更不用说声明它们并使它们可以替代元素 A。

以下 XML 实例对您的架构的更正版本有效:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Mamix.xsd">
    <A xsi:type="B"><text>lalala</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="C"><text>fofofo</text></A>
    <A xsi:type="B"><text>lalala</text></A>
</mylist>

如果您想允许元素 B 和 C 代替,请使用适当的类型声明它们并指定它们可替代元素 A(这必须是顶级元素才能实现)。您的架构将如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="A" abstract="true">
        <xs:sequence>
            <xs:element name="text" type="xs:string"/>
        </xs:sequence>        
    </xs:complexType>

    <xs:complexType name="B">
        <xs:complexContent>
            <xs:extension base="A"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="C">
        <xs:complexContent>
            <xs:extension base="B"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="A" type="A"/>
    <xs:element name="B" type="B" substitutionGroup="A"/>
    <xs:element name="C" type="C" substitutionGroup="A"/>

    <xs:element name="mylist">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="A"/>
            </xs:sequence>            
        </xs:complexType>
    </xs:element>

</xs:schema>

针对此架构,以下实例(通过添加“A”声明所需的“文本”元素从您的原始 XML 修改)是有效的:

<mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Mamix.xsd">
    <B><text>lalala</text></B>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <C><text>fofofo</text></C>
    <B><text>lalala</text></B>
</mylist>
于 2013-09-16T19:58:29.957 回答