xml模式的任何好理由“元素的顺序是重要的”规则?

时间:2009-06-03 16:58:50

标签: xml design-patterns

我不明白为什么元素的顺序是重要的,而不是属性的情况。

任何人都可以提供合理的理由吗?

element addressBook {
  element card {
    attribute name { text },
    attribute email { text }
  }*
}

在XML中,属性的顺序传统上并不重要。 RELAX NG遵循这一传统。上述模式将匹配

<card name="John Smith" email="js@example.com"/>

<card email="js@example.com" name="John Smith"/>

相反,元素的顺序很重要。模式

element card {
  element name { text },
  element email { text }
}

不匹配

<card><email>js@example.com</email><name>John Smith</name></card>

那个怎么样:

如果元素或属性的子元素与数据类型模式匹配,则元素或属性的完整内容必须与该数据类型模式匹配。不允许具有允许部分内容与数据类型模式匹配的模式,以及与另一模式匹配的另一部分。例如,不允许使用以下模式:

element bad {
  xsd:int,
  element note { text }
}

然而,这没关系:

element ok {
  xsd:int,
  attribute note { text }
}

请注意,此限制不适用于文本模式。

3 个答案:

答案 0 :(得分:7)

我怀疑这是因为属性名称在元素中必须是唯一的,并且无论顺序如何都可以消除歧义,而包含的元素不必是唯一的。区分其他相同元素的唯一方法是按顺序排列。当订单很重要时,这很重要。 E.g:

<li>Put on underwear</li>
<li>Put on pants.</li>

在语义上与

不同
<li>Put on pants.</li>
<li>Put on underwear</li>

答案 1 :(得分:6)

订购通常很重要。想象一下,例如,XHTML段落是否随机重新排序。然而,属性自然是“属性包” - 一组值而不是序列。这也是为什么你不能用元素声明重复属性,但你可以重复具有相同名称的元素。

这只是XML设计的一部分。属性和元素在很多方面都不同,而不仅仅是排序。有时将处理元素视为与顺序无关是有意义的,但这意味着什么将取决于具体情况。然而,处理一种情况是错误的,在这种情况下,排序无关紧要,因为它应该从不重要。

答案 2 :(得分:3)

因为可以重复具有相同名称的元素,例如

<List>
    <Item>a</Item>
    <Item>b</Item>
    <Item>c</Item>
</List>

而属性不能,例如

<List Item="a" Item="b" Item="c" /> <!-- illegal -->

这意味着元素对于事物列表很有用,而属性则不然。由于列表通常是位置的,因此从XML中的顺序推断出位置是有意义的,这比下面的东西更容易混淆(这需要特别了解位置的指示方式或者额外的XML保留字是用于此,两者都不是一个有吸引力的选择。)

<List>
    <Item Position="2">a</Item>
    <Item Position="1">b</Item>
    <Item Position="3">c</Item>
</List>