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

79

这两者有什么区别,我在什么情况下应该使用哪个:

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

对比

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

感谢

5个回答

73

XML有基于元素和基于属性两种不同的格式,在你的例子中,第一种是基于元素的,第二种是基于属性的。

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

基于属性

  • 比基于元素小
  • 不太互操作,因为大多数XML解析器会认为用户数据由元素表示,属性被用来描述元素
  • 无法为某些数据类型表示可空值,例如可为空的int
  • 不能表达复杂类型

基于元素

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

实用

如果您真的关心XML的大小,请尽可能使用属性。需要表示可空值、复杂类型或包含大量文本值时,请使用元素。如果您不关心XML的大小或在传输期间启用了压缩,请使用元素,因为它们更具可扩展性。

背景

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

这里有一篇文章也解释了这个问题:Element vs attribute


2
属性中心的XML与JSON相比具有巨大的互操作性优势。你只需要一些提示,告诉你将什么放入数组,将什么视为数字或布尔值,就可以进行完美的自动转换。 - PstScrpt

5
在未来,如果您添加一个<address>属性,您可能不希望将其作为XML属性。这是因为<address>可能是一个更复杂的元素,由街道地址、城市、国家等组成。
因此,除非您确信该属性不需要深入到更多层级,否则您可能想选择第一个子元素形式。第一种形式可以在未来实现更大的可扩展性。
如果您关心空间,可以压缩您的XML。

只是好奇,不用两者兼而有之吗?比如将名和姓作为属性,然后地址作为节点。我的意思是你不仅要选择一个。正确吗? - Jacob Schoen
2
你说得没错,但为了表示单个实体(原始示例中的“人”)的属性一致性,你可能想选择其中一个。这样你就不必记住哪个以哪种方式存储。 - Greg Hewgill
<person firstname="Joe" lastname="Plumber"> <address street1="1234 Any Street" postalCode="12345" State="CA" City="Example" /> </person> 我无法弄清楚如何使其正确格式化,但重点是,您不会削减可扩展性。 使用基于属性的XML时,您避免的不是子元素,而是文本节点。 - PstScrpt

4

我发现以下信息非常有助于简要解释属性与元素的选择:

使用属性的一些问题包括:

属性不能包含多个值(元素可以)
属性不能包含树形结构(元素可以)
属性不易扩展(用于未来的更改)

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

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


1
很遗憾这个答案没有更多的投票,因为我认为它很好地总结了问题,特别是关于“属性难以阅读和维护。使用元素来存储数据。使用属性来存储与数据无关的信息。” - Peter Ellis

4
在我们公司,我们更倾向于第二种方法。我们认为,“firstname”和“lastname”是“person”节点的属性,而不是其子字段。这是一个微妙的区别。我认为第二种方法更加简洁,可读性和可维护性显著提高,这非常重要。当然,这取决于你的应用程序。我不认为有一条适用于所有场景的普遍规则。

1
第二种方法对人类来说更易读,但第一种方法对大多数解析器更易读。第一种方法还更加可扩展。您应该阅读由 @codemeit 引用的文章 (http://www.ibm.com/developerworks/xml/library/x-eleatt.html)。 - awe

2

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

属性不能重复。如果“Joe”有两个名字,请使用节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接