XML - 区分不同子元素的首选方法

时间:2016-06-21 14:07:29

标签: xml

问题

我有一个xml元素(shape),其中可能有不同的子元素(circlesquare,...),它们本身都有不同的元素结构:

  • circle有一个radius
  • square有一个length
  • ...

所以我的问题是如何指出shape的子元素的不同可能性。不仅从设计的角度来看,还要记住将使用xml文件的软件。

途径

版本1:

<shape>
  <circle>
    <radius unit="meter">1</radius>
  </circle>
</shape>

此版本看起来更完整,因为radius实际上是circle的属性。但是对于软件我发现尝试所有可能的子标签(circlesquare,...)有点麻烦,直到找到存在的标签为止。
shape的第一个子标记指定形状的假设在某种程度上打破了shape的可扩展性。在这种情况下,还需要定义元素的固定排序。

版本2:

<shape type="circle">
  <radius unit="meter">1</radius>
</shape>

使用此版本radius标记似乎有些遗弃,但结构有意义,因为在这种特定情况下(shapecircleradius实际上是shape的财产 对我来说,con是引入额外属性type,其名称不是很明显可供选择(也可以是&#34; kind&#34;,...)。
然而,一个很大的问题是,软件会立即知道shape的哪些属性存在,这只需要查找circle的属性(在某些规范中已修复)。

问题

如果一次只有一个子元素,并且每个子元素本身都包含子元素,那么区分不同子元素的首选方法是什么?
您是否有任何经验/您是否认为这两种方法或其他方法有任何利弊?

1 个答案:

答案 0 :(得分:2)

如果必须这样做,我会在choice元素的xml架构定义中使用shape的第一类方法。因此,可以非常容易地引入新的形状。

这样,您就可以清晰地定义每个元素,同时也可以验证每种类型的形状。

带有circlesquare形状的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>

现在,每个类型circleTypesquareTypetriangleType都可以根据需要进行定义,并且验证非常简单和严格。当然,您知道如何使用自己的有效元素集来定义每种类型。

由于使用choice,因此它只允许其中一种形状作为shape元素的子元素。如果你想要更多的形状,你可能需要多重性(1+)到shape元素。

如果您选择其他方法(#2),可以使用或不更改xml schema definition来引入/扩展新形状。但是,验证将很困难。

希望这有帮助。