对XML中的列表使用容器元素有什么好处?

对XML中的列表使用容器元素有什么好处?,xml,coding-style,Xml,Coding Style,当指定包含项目列表的XML格式时,通常至少可以选择两种不同的样式。一个为列表使用容器元素,另一个不使用。例如:如果指定具有多个页面的文档,可以执行以下操作: <document> <title>...</title> <pages> <page>...</page> <page>...</page> </pages> </document> ..

当指定包含项目列表的XML格式时,通常至少可以选择两种不同的样式。一个为列表使用容器元素,另一个不使用。例如:如果指定具有多个页面的文档,可以执行以下操作:

<document>
  <title>...</title>
  <pages>
    <page>...</page>
    <page>...</page>
  </pages>
</document>

...
...
...
或者仅仅是这样:

<document>
  <title>...</title>
  <page>...</page>
  <page>...</page>
</document>

...
...
...
每种方法的优缺点是什么

我能想到的有:

  • 前者允许表达一个显式的空列表(如果列表本身是一个概念实体,则很有用)
  • 前者在错误恢复方面可能稍好一些(尽管如果使用XSD验证,这并不重要)
  • 后者更简洁
  • 后者不需要区分添加第一个元素和任何后续元素(不管理容器元素)
编辑

澄清一下:我假设
页面
元素没有任何意义。里面没有其他元素,没有附加属性,除了“页面”、“页面列表”或类似名称之外,很难找到其他名称

编辑2


我发现了同样的问题。虽然答案都是针对容器/父元素的,但它似乎归结为将容器视为实际对象,或者假设通过使用额外的容器元素(我倾向于不同意)更容易对模式建模。

在您给出的示例中,差异很小,然而,这两个例子实际上代表了完全不同的事物:

  • 第二个例子是一个有标题和许多页面的文档
  • 然而,第一个示例是标题为且页面集合为

正如我所说,在你的例子中,差异是多余的,因此很容易被忽略,因此,请考虑下面的细微变化:

<document>
  <title>...</title>
  <contents>
    <page>...</page>
    <page>...</page>
  </contents>
  <chapter name="chapterName">
    <page>...</page>
    <page>...</page>
  </chapter>
  <index>
    <page>...</page>
    <page>...</page>
  </index>
</document>
在本例中,我们在标题前有一个页面(无论出于何种原因),这在使用集合时显然是不可能的。另一个需要考虑的问题是,每个集合(例如)也可能有一个
标题


我的观点是,它们代表着不同的东西——这并不是真正的pro与con的对比,而是选择与您的数据模型最匹配的格式。

这实际上是个人选择的问题,尽管第一种格式更强大,但IMO.t会生成多个
页面,例如,可能使用不同名称的页面。这取决于你的要求

<document>
  <title>...</title>
  <pages name="page1">
    <page>...</page>
    <page>...</page>
  </pages>
  <pages name="page2">
    <page>...</page>
    <page>...</page>
  </pages>
</document>

...
...
...
...
...

如果您遵循XSD的
Venetian Blind
风格,使用直接容器化元素的集合验证XML,并且如果您希望这些元素包含本地唯一的类键属性:您将无处放置
xs:key
定义。这些元素不允许直接位于
xs:complexType
xs:complexContent
下,这将是集合元素的唯一直接父元素。如果没有这些元素名为复数的额外容器,那么具有显式全局多态复杂类型的Puritist
Venetian Blind
样式将是不可能的。这不是一个概念,而是一个工具限制。

我理解您的观点,但我所说的是列表中没有概念实体的场景。容器元素上没有属性,内部只有一种元素类型。MS非常喜欢这样做(参见DatadiagramML,VisioXML格式),还有一条评论:我可以在XSD(和其他模式语言)中定义的顺序,而不需要容器元素。标题和页面之间的强制顺序实际上更容易实现,特别是当您只需要一个标题元素时。@Peter-如果您的示例与问题中描述的完全相同,并且永远不会更改,则选择完全是任意的。(我个人的偏好可能是第一种选择)在我看来,微软的模式选择似乎是为了让xml格式紧密地代表应用程序内部使用的数据结构(例如,
文档
类有一个
页面
集合,而不是页面集合)我很肯定你关于映射内部数据结构的假设是正确的。我经常使用VBA文档来理解XML格式。
<document>
  <page>...</page>
  <title>...</title>
  <page>...</page>
  <page>...</page>
</document>
<document>
  <title>...</title>
  <pages name="page1">
    <page>...</page>
    <page>...</page>
  </pages>
  <pages name="page2">
    <page>...</page>
    <page>...</page>
  </pages>
</document>