2015-07-12 57 views
1

请考虑以下情形:是否可以实例化一个double-extended complexType?

我想将元素及其属性保存到数据库中,这些元素从一个名为“PersistentElement”的常见但超级抽象类型扩展而来。现在,这些元素中的一些都具有特定属性,例如他们都有一个名字,所有这些元素又有一个共同的超级名称叫做NamedElement,它又是抽象的。这导致一个模式/ 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-type元素,但出于好奇,因为我还在学习,所以我想知道是否可以使用双扩展抽象元素。我面对的问题是,我不能(或者更确切地说不知道如何)在相应的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'. 

回答

0

是的,你可以扩展一个已扩展型。

是Xerces的,可为您的XSD的错误信息是:

S4S-ELT-无效-content.1: 'ElementWithName' 的内容是 无效。元素的“元素”无效,放错位置,或经常发生 。

包装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> 
+0

这不是很我想达到的目标。对不起,如果不明确。我想实例化一个“数据库” - >“元素”元素。我将编辑我的问题。 – luksen

+0

好的。我已根据您的评论和问题更新更新了XSD和XML。您更新的XML文档现在可以在上述XSD上成功验证。 – kjhughes

+0

当我第一次问这个问题时,我的XSD模式和XML文件已经看起来和你的完全一样了,但它仍然给出错误,更新了上面的错误。也许验证器是错误的吗?^^ – luksen

相关问题