是否可以实例化双重扩展的 complexType?
Is it possible to instantiate a double-extended complexType?
考虑以下场景:
我想将元素及其属性保存在数据库中,这些元素扩展自一个名为 "PersistentElement" 的通用但抽象的超类型。现在,其中一些元素都具有特定的属性,例如它们都有一个名字,所有这些元素再次共享一个名为 "NamedElement" 的公共超元素,这又是抽象的。这导致 schema/XSD 看起来像这样:
<xs:element name="Database">
<xs:complexType>
<xs:sequence>
<xs:element name="elements" type="PersistentElement" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="PersistentElement" abstract="true">
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
<xs:complexType name="NamedElement" abstract="true">
<xs:complexContent>
<xs:extension base="PersistentElement">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ElementWithName">
<xs:complexContent>
<xs:extension base="NamedElement">
<xs:element name="somethingElse" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
现在我的问题是:
这在 XML 中甚至可能吗?最明显的解决方法是使抽象元素之一成为 xs:choice 类型的元素,但出于好奇,并且因为我还在学习,我想知道是否有双重扩展抽象元素是可能的。我面临的问题是,我不能(或更确切地说不知道如何)在相应的 XML 文件中实例化这样一个元素。我想要的是:
<Database>
<elements xsi:type="ElementWithName" id = "E1" name="testElement1" >
<somethingElse>bla</somethingElse>
</elements>
<elements xsi:type="ElementWithName" id = "E2" name="testElement2" >
<somethingElse>blub</somethingElse>
</elements>
</Database>
但是当我尝试验证时这给了我一个错误,
Cvc-elt.4.2: Cannot Resolve 'ElementWithName' To A Type Definition For Element 'elements'.. Line '13', Column '66'.
Cvc-type.2: The Type Definition Cannot Be Abstract For Element Elements.. Line '13', Column '66'.
Cvc-complex-type.3.2.2: Attribute 'name' Is Not Allowed To Appear In Element 'elements'.. Line '13', Column '66'.
Cvc-complex-type.2.1: Element 'elements' Must Have No Character Or Element Information Item [children], Because The Type's Content Type Is Empty.. Line '16', Column '16'.
是的,您可以扩展已经扩展的类型。
Xerces 为您的 XSD 提供的错误消息是:
s4s-elt-invalid-content.1: The content of 'ElementWithName' is
invalid. Element 'element' is invalid, misplaced, or occurs too
often.
将 xs:element/@name="somethingElse"
包装在 xs:sequence
中可解决此错误。
这是更正后的完整内容XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Database">
<xs:complexType>
<xs:sequence>
<xs:element name="elements" type="PersistentElement" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="PersistentElement" abstract="true">
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
<xs:complexType name="NamedElement" abstract="true">
<xs:complexContent>
<xs:extension base="PersistentElement">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ElementWithName">
<xs:complexContent>
<xs:extension base="NamedElement">
<xs:sequence>
<xs:element name="somethingElse" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
根据上述 XSD,这是一份有效的 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Database xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Database.xsd">
<elements xsi:type="ElementWithName" id = "E1" name="testElement1" >
<somethingElse>bla</somethingElse>
</elements>
<elements xsi:type="ElementWithName" id = "E2" name="testElement2" >
<somethingElse>blub</somethingElse>
</elements>
</Database>
考虑以下场景:
我想将元素及其属性保存在数据库中,这些元素扩展自一个名为 "PersistentElement" 的通用但抽象的超类型。现在,其中一些元素都具有特定的属性,例如它们都有一个名字,所有这些元素再次共享一个名为 "NamedElement" 的公共超元素,这又是抽象的。这导致 schema/XSD 看起来像这样:
<xs:element name="Database">
<xs:complexType>
<xs:sequence>
<xs:element name="elements" type="PersistentElement" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="PersistentElement" abstract="true">
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
<xs:complexType name="NamedElement" abstract="true">
<xs:complexContent>
<xs:extension base="PersistentElement">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ElementWithName">
<xs:complexContent>
<xs:extension base="NamedElement">
<xs:element name="somethingElse" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
现在我的问题是: 这在 XML 中甚至可能吗?最明显的解决方法是使抽象元素之一成为 xs:choice 类型的元素,但出于好奇,并且因为我还在学习,我想知道是否有双重扩展抽象元素是可能的。我面临的问题是,我不能(或更确切地说不知道如何)在相应的 XML 文件中实例化这样一个元素。我想要的是:
<Database>
<elements xsi:type="ElementWithName" id = "E1" name="testElement1" >
<somethingElse>bla</somethingElse>
</elements>
<elements xsi:type="ElementWithName" id = "E2" name="testElement2" >
<somethingElse>blub</somethingElse>
</elements>
</Database>
但是当我尝试验证时这给了我一个错误,
Cvc-elt.4.2: Cannot Resolve 'ElementWithName' To A Type Definition For Element 'elements'.. Line '13', Column '66'.
Cvc-type.2: The Type Definition Cannot Be Abstract For Element Elements.. Line '13', Column '66'.
Cvc-complex-type.3.2.2: Attribute 'name' Is Not Allowed To Appear In Element 'elements'.. Line '13', Column '66'.
Cvc-complex-type.2.1: Element 'elements' Must Have No Character Or Element Information Item [children], Because The Type's Content Type Is Empty.. Line '16', Column '16'.
是的,您可以扩展已经扩展的类型。
Xerces 为您的 XSD 提供的错误消息是:
s4s-elt-invalid-content.1: The content of 'ElementWithName' is invalid. Element 'element' is invalid, misplaced, or occurs too often.
将 xs:element/@name="somethingElse"
包装在 xs:sequence
中可解决此错误。
这是更正后的完整内容XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Database">
<xs:complexType>
<xs:sequence>
<xs:element name="elements" type="PersistentElement" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="PersistentElement" abstract="true">
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
<xs:complexType name="NamedElement" abstract="true">
<xs:complexContent>
<xs:extension base="PersistentElement">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ElementWithName">
<xs:complexContent>
<xs:extension base="NamedElement">
<xs:sequence>
<xs:element name="somethingElse" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
根据上述 XSD,这是一份有效的 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Database xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Database.xsd">
<elements xsi:type="ElementWithName" id = "E1" name="testElement1" >
<somethingElse>bla</somethingElse>
</elements>
<elements xsi:type="ElementWithName" id = "E2" name="testElement2" >
<somethingElse>blub</somethingElse>
</elements>
</Database>