XML 最佳实践: 属性与附加元素

这两者之间的区别是什么? 什么时候应该使用它们:

<person>
<firstname>Joe</firstname>
<lastname>Plumber</lastname>
</person>

VS

<person firstname="Joe" lastname="Plumber" />

谢谢

28372 次浏览

在我的公司,我们倾向于第二种方法。

我们认为“ firstname”和“ lastname”是“ person”节点的 属性,而不是“ person”节点的 子领域。这是一个细微的差别。

在我看来,第二种方法更简洁,可读性/可维护性得到显著改善,这一点非常重要。

当然,这取决于您的应用程序。我不认为存在一个涵盖所有情况的一揽子规则。

属性对顺序不敏感。这可能是优点,也可能是缺点,取决于你的情况。

属性不能复制。如果“ Joe”有两个名字,那么节点是唯一的方法。

将来添加 <address>属性时,您可能不希望将其作为 XML 属性。这是因为 <address>可能是由街道地址、城市、国家等组成的更复杂的元素。

出于这个原因,您可能需要选择第一个子元素形式,除非您确信该属性不需要进行更深入的操作。第一种形式允许将来有更大的扩展性。

如果您非常关心空间,那么可以压缩 XML。

有以元素为中心的和以属性为中心的 XML,在您的示例中,第一个是以元素为中心的,第二个是 以属性为中心。

大多数情况下,这两种模式是等价的,但也有一些例外。

以属性为中心

  • 比以元素为中心的尺寸小。
  • 由于大多数 XML 解析器认为用户数据是由元素表示的,因此不能很好地进行互操作,所以使用 Attritribute 来描述元素。
  • 对于某些数据类型,无法显示可为空的值
  • 无法表示复杂类型。

以元素为中心

  • 复杂类型只能表示为元素节点。
  • 非常容易操作
  • 大于以属性为中心的大小(压缩可以用来显著减小大小)
  • 可为空的数据可以用属性 xsi: nil = “ true”表示
  • 解析速度更快,因为解析器只查找用户数据的元素。

实用

如果您确实关心 XML 的大小,那么只要可能,就使用属性(如果适当的话)。在需要可空、复杂类型或保存大文本值的地方使用元素。如果您不关心 XML 的大小,或者在传输过程中启用了压缩,那么坚持使用元素,因为它们更具可扩展性。

背景资料

在 DOTNET 中,XmlSerializer 可以将对象的属性序列化为属性或元素。 在最近的 WCF 框架中,DataContact 序列化器只能将属性序列化为元素,而且它比 XmlSerializer 更快; 原因很明显,它只需要在反序列化时从元素中查找用户数据。

这里有一篇文章也对此进行了解释 元素与属性

我发现以下信息非常有助于以简短的方式解释属性和元素的选择

使用属性的一些问题是:

属性不能包含多个值(元素可以)
属性不能包含树结构(元素可以)
属性不容易扩展(对于将来的更改) < br >

属性很难阅读和维护。对数据使用元素。对与数据无关的信息使用属性。

来源: http://www.w3schools.com/xml/xml_attributes.asp