我相信已经了解this article中的所有内容,但似乎仍有一些工作可供我使用。
如果我的班级中有一个简单的继承树:
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>
请记住,这只是伪代码,因为没有很多名称空间的短xmls。
为什么验证者告诉我(例如记事本++)它仍然期待
<A>
而不是<B>
或<C>
?
答案 0 :(得分: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'要求的声明的'text'元素从原始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>