我有一个xml元素(shape
),其中可能有不同的子元素(circle
,square
,...),它们本身都有不同的元素结构:
circle
有一个radius
square
有一个length
所以我的问题是如何指出shape
的子元素的不同可能性。不仅从设计的角度来看,还要记住将使用xml文件的软件。
<shape>
<circle>
<radius unit="meter">1</radius>
</circle>
</shape>
此版本看起来更完整,因为radius
实际上是circle
的属性。但是对于软件我发现尝试所有可能的子标签(circle
,square
,...)有点麻烦,直到找到存在的标签为止。
shape
的第一个子标记指定形状的假设在某种程度上打破了shape
的可扩展性。在这种情况下,还需要定义元素的固定排序。
<shape type="circle">
<radius unit="meter">1</radius>
</shape>
使用此版本radius
标记似乎有些遗弃,但结构有意义,因为在这种特定情况下(shape
是circle
)radius
实际上是shape
的财产
对我来说,con是引入额外属性type
,其名称不是很明显可供选择(也可以是&#34; kind&#34;,...)。
然而,一个很大的问题是,软件会立即知道shape
的哪些属性存在,这只需要查找circle
的属性(在某些规范中已修复)。
如果一次只有一个子元素,并且每个子元素本身都包含子元素,那么区分不同子元素的首选方法是什么?
您是否有任何经验/您是否认为这两种方法或其他方法有任何利弊?
答案 0 :(得分:2)
如果必须这样做,我会在choice
元素的xml架构定义中使用shape
的第一类方法。因此,可以非常容易地引入新的形状。
这样,您就可以清晰地定义每个元素,同时也可以验证每种类型的形状。
带有circle
和square
形状的Xsd片段:
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element name="circle" type="circleType" />
<xs:element name="square" type="squareType" />
<xs:element name="Triangle" type="triangleType" />
.....
</xs:choice>
现在,每个类型circleType
,squareType
和triangleType
都可以根据需要进行定义,并且验证非常简单和严格。当然,您知道如何使用自己的有效元素集来定义每种类型。
由于使用choice
,因此它只允许其中一种形状作为shape
元素的子元素。如果你想要更多的形状,你可能需要多重性(1+)到shape
元素。
如果您选择其他方法(#2),可以使用或不更改xml schema definition
来引入/扩展新形状。但是,验证将很困难。
希望这有帮助。