在指定包含项目列表的 XML 格式时,通常至少有两种不同的样式可供选择。一个使用列表的容器元素,另一个不使用。例如:如果指定一个包含多个页面的文档,可以这样做:
<document>
<title>...</title>
<pages>
<page>...</page>
<page>...</page>
</pages>
</document>
或者只是这样:
<document>
<title>...</title>
<page>...</page>
<page>...</page>
</document>
每种方法的优缺点是什么?
我能想到的有:
- 前者允许表达一个明确的空列表(如果列表本身是一个概念实体则很有用)
- 前者在错误恢复方面可能稍微好一些(尽管如果使用 XSD 验证那应该无关紧要)
- 后者更简洁
- 后者不需要区分添加第一个元素还是任何后续元素(不管理容器元素)
编辑
澄清一下:我假设 pages
元素没有任何意义。里面没有其他元素,没有附加属性,很难找到除“pages”、“pageList”或类似名称之外的任何其他名称。
编辑 2
我找到了 another entry关于同一个问题。虽然答案都是针对容器/父元素的,但似乎归结为将容器视为实际对象,或者假设通过拥有额外的容器元素更容易对模式建模(我倾向于不同意)。
最佳答案
在您给出的示例中,差别很小,但是这两个示例实际上代表了完全不同的事物:
- 第二个例子是一个有标题和很多页的文档
- 然而,第一个示例是一个带有标题和页面集合的文档
正如我所说,在您的示例中,差异是多余的,因此很容易被忽略,因此请考虑以下细微变化:
<document>
<title>...</title>
<contents>
<page>...</page>
<page>...</page>
</contents>
<chapter name="chapterName">
<page>...</page>
<page>...</page>
</chapter>
<index>
<page>...</page>
<page>...</page>
</index>
</document>
在这种情况下,文档有许多 页面集合。 (当然,有些人可能会争辩说您同样可以用不同的方式表示):
<document>
<title>...</title>
<page section="contents">...</page>
<page section="chapter1">...</page>
<page section="index">...</page>
</document>
但是,您将不得不更改 page
元素,在上面的示例中,我认为情况更糟(为什么要page
必须知道它包含什么?)
另一个微妙的考虑是,元素的排序通常意味着:
<document>
<page>...</page>
<title>...</title>
<page>...</page>
<page>...</page>
</document>
在这个例子中,我们(无论出于何种原因)在标题之前有一个页面——显然在使用集合时是不可能的。另一个考虑因素是每个集合也可能(例如)有一个 title
。
我的观点是,它们代表不同的事物 - 这并不是真正的赞成与反对的情况,而是选择与您的数据模型最匹配的格式的情况。
关于xml - 对 XML 中的列表使用容器元素有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713609/