现在的位置: 首页 > 综合 > 正文

Xml设计 选择元素还是属性

2012年10月01日 ⁄ 综合 ⁄ 共 2456字 ⁄ 字号 评论关闭

原文链接

http://www.ibm.com/developerworks/xml/library/x-eleatt/index.html 

何时使用元素何时使用属性来表示信息在某些情况下是很明确的
1.如果信息本身需要使用多个元素来标记,放进一个元素里
2.如果同样名字的信息在父元素里可以出现多次,使用子元素
3.如果信息和标准的DTD属性类型很相似,如ID,IDREF,ENTITY等,使用属性
4.如果信息名称里包含空格,使用子元素

不幸的是设计时的场景并不是总是如此明确非黑即白的,在那些灰色地带如何做出正确选择?
通常的回答是,不能一概而论,得根据情况自己判断,但是这个答案看起来实在没什么用处,
没错,即使专家也不一定就某种情况能达成一致意见,但是总还是应该有些基本的原则来选择使用元素还是属性。

首先,我提到并不推荐的两个原则。 一个是把所有的的东西都定义成元素,理由很多,从属性使事情复杂化到属性妨碍可扩展性等
但是如果不使用属性,那就抛弃了xml强大功能的很重要一部分,或许你使用分割符文件还好些。
另外一个是,将需要浏览器中展示的内容使用元素表示。这种观点的问题在于,它促使设计人员设计内容时考虑展示方式,这两种
考虑方式不应该混在一起。我提出的是一个很相似的指导原则,我按照内容的目的来。

我把它分成几个原则,这些都是经验规则,并不是绝对的,如果你觉得有必要那就打破它。

1.核心内容原则
如果信息在表达或者交流时被视作基本的核心的材料,那么使用元素。(好吧,这句话看起来确实比较费劲,好在下边有点解释。)
对于为人所阅读的文档来说,指的就是需要和读者交流的核心内容。对于面向机器记录格式来说,指的就是直接来自问题领域的数据。
如果信息在主交流(这词真别扭,你懂得就好)中是次要的,附带的,或者纯粹是为了帮助程序处理主交流,那么使用属性。
这样就避免了将核心内容和附加内容混合在一起。

我见到过很多xml格式,将文档的标题放在属性里边,我认为标题是一个文档中用于交流的很基础的部分,应该总是放在元素里边。
另外也经常见到一些情况,内部的产品Id作为元素被丢进产品的描述信息,我认为属性更合适,读者不会对这些内部的代码感兴趣,尤其是Id很长或者格式不可理解的时候。
你可能听过这样一个更精炼的说法,数据用元素,元数据用属性,就是这个意思。

2.结构化信息原则
当信息需要用结构化的方式来表示,尤其是可能扩展的情况下,使用元素。与之相对的,如果信息是一个原子性记号,使用属性。
日期就是一个好例子,它的结构是固定的,而且通常是作为一个单一记号存在,使用属性是合理的。而人名则相反,人名的结构不是固定的(在某些文化里,
省略尊称或者假定了个部分的顺序可能导致混乱或不敬)。人名也极少是一个原子性的记号,比如说你也许想要按照姓氏排序,也许想要按照名字排序。
另外我得说明,把全名都塞进一个元素里边和把全名用作属性都是有问题的,因此,

<customer>
<name>Gabriel Okara</name>
<occupation>Poet</occupation>
</customer>

并不比下边的定义好到哪儿去

<customer name="Gabriel Okara">
<occupation>Poet</occupation>
</customer>

3.可读性原则
如果信息是提供给人来阅读和理解的,使用元素。
如果信息是为机器所理解和使用的,使用属性。这通常意味着,把非自然语言的信息放进属性。
在某些情况下,人可以译解要表达的信息,但是仍需要机器才能正确使用它。比如Url,人能够从web浏览器或者邮件信息中读到url,
但是没有机器去获取相应资源的话,url通常没什么用处。有些数据库里的标识符也是人可读的(虽然数据库管理的最佳实践并不推荐使用带业务信息的标识符),
但是这些标识符都是机器来处理的。因此,我推荐把Url和Id放进属性里。

4.元素/属性绑定原则
如果信息的值会被另外一个属性的值来修改,那么使用元素。xml在属性和属性所在的元素之间建立很强的概念绑定。
一个属性提供了特定元素的property或"修改"。xml处理工具倾向于遵循这个概念,如果一个属性会修改另外一个属性是非常糟糕的事情。
举个例子,你现在要设计餐馆菜单的格式,你把份量加进了菜单。你也许会觉得这个信息对读者并不重要,所以按照核心内容原则,份量放进了属性里。

<menu>
<menu-item portion="250 mL">
<name>Small soft drink</name>
</menu-item>
<menu-item portion="500 g">
<name>Sirloin steak</name>
</menu-item>
</menu>

然后呢,按照结构化信息原则,你决定不把份量值和单位放进一个元素里,把它们分开

<menu>
<menu-item portion-size="250" portion-unit="mL">
<name>Small soft drink</name>
</menu-item>
<menu-item portion-size="500" portion-unit="g">
<name>Sirloin steak</name>
</menu-item>
</menu>

这样,portion-unit属性就修改了portion-size属性,这很糟糕。
menu-item元素的属性只应该修改menu-item元素本身,不能修改其他的东西。解决办法如下,

<menu>
<menu-item>
<portion unit="mL">250</portion>
<name>Small soft drink</name>
</menu-item>
<menu-item>
<portion unit="g">500</portion>
<name>Sirloin steak</name>
</menu-item>
</menu>

这个例子说明了这些原则可能会导致互相冲突的结论,这时候你就的根据情况自己作出判断。

抱歉!评论已关闭.