2015-09-24 50 views
0

我有一个定义下列类型XML模式 - 简单类型与继承属性列表

XML架构
<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
    <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:complexContent> 
     <xsd:extension base="sa:visualElement"> 
      <xsd:attribute name="label" type="xsd:string" use="required" />   
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xs:element name="text" type="textElement"/> 

的问题是,这意味着我们必须作如下

<text id="myText" style="Fancy" label="This is the display text" /> 

当定义一个文本元素我真正想要做的就是这样定义它

<text id="myText" style="Fancy"> 
    This is the display text here. 
</text> 

我的textElement类型应该扩展vi sualElement类型,因为我们使用JAXB生成Java类来解析XML。然后使用JaxB CLasses继承以类似的方式处理所有视觉元素。

有没有一种方法来构建模式,以便我可以实现所需的XML格式,同时仍然继承VisualElement类型的属性?

回答

0

我认为你必须让visualElement允许简单的内容。那么你可以扩展或限制它在textElement。喜欢的东西:

<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
      <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:simpleContent> 
     <xsd:extension base="sa:visualElement"/> 
    </xsd:complexContent> 
</xsd:complexType> 

我觉得你的确要好好含simpleContentvisualElement,否则你无法在textElement扩展它。但也试试:

<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
    <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:simpleContent> 
     <xsd:extension base="sa:visualElement"/> 
    </xsd:complexContent> 
</xsd:complexType> 

虽然,我不认为这会奏效。

另一种选择是使用attributeGroup s。但它不会是你想要的好继承。

+0

您的第一个建议奏效。然而,因为我们使用visualElement的其他一些类型,其中一些不应该包含一个字符串,它仍然不是我们所需要的。我已经尝试过你的第二个建议,它是无效的。 –

+0

事后看来,如果你仔细想想,我希望获得多重继承......我想这也解释了为什么我没有走得太远。为了方便起见,我们现在坚持使用标签。感谢您的建议。 –

+0

@PaulHenry您不能拥有多重继承,但可以使用属性组进行聚合。你也可以使用继承插件来让你的类实现一个特定的接口 - 这与属性组相结合几乎和真正的多重继承一样好。 – lexicore