对XML中的列表使用容器元素有什么好处?
当指定包含项目列表的XML格式时,通常至少可以选择两种不同的样式。一个为列表使用容器元素,另一个不使用。例如:如果指定具有多个页面的文档,可以执行以下操作:对XML中的列表使用容器元素有什么好处?,xml,coding-style,Xml,Coding Style,当指定包含项目列表的XML格式时,通常至少可以选择两种不同的样式。一个为列表使用容器元素,另一个不使用。例如:如果指定具有多个页面的文档,可以执行以下操作: <document> <title>...</title> <pages> <page>...</page> <page>...</page> </pages> </document> ..
<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
下,这将是集合元素的唯一直接父元素。如果没有这些元素名为复数的额外容器,那么具有显式全局多态复杂类型的PuritistVenetian 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>