XML设计—选择元素还是属性

何时使用元素何时使用属性来表示信息在某些情况下是很明确的
1.如果信息本身需要使用多个元素来标记,放进一个元素里
2.如果同样名字的信息在父元素里可以出现多次,使用子元素
3.如果信息和标准的DTD属性类型很相似,如ID,IDREF,ENTITY等,使用属性
4.如果信息名称里包含空格,使用子元素
不幸的是设计时的场景并不是总是如此明确非黑即白的,在那些灰色地带如何做出正确选择?
通常的回答是,不能一概而论,得根据情况自己判断,但是这个答案看起来实在没什么用处,
没错,即使专家也不一定就某种情况能达成一致意见,但是总还是应该有些基本的原则来选择使用元素还是属性。
首先,我提到并不推荐的两个原则。 一个是把所有的的东西都定义成元素,理由很多,从属性使事情复杂化到属性妨碍可扩展性等
但是如果不使用属性,那就抛弃了xml强大功能的很重要一部分,或许你使用分割符文件还好些。
另外一个是,将需要浏览器中展示的内容使用元素表示。这种观点的问题在于,它促使设计人员设计内容时考虑展示方式,这两种
考虑方式不应该混在一起。我提出的是一个很相似的指导原则,我按照内容的目的来。
我把它分成几个原则,这些都是经验规则,并不是绝对的,如果你觉得有必要那就打破它。
1.核心内容原则
如果信息在表达或者交流时被视作基本的核心的材料,那么使用元素。(好吧,这句话看起来确实比较费劲,好在下边有点解释。)
对于为人所阅读的文档来说,指的就是需要和读者交流的核心内容。对于面向机器记录格式来说,指的就是直接来自问题领域的数据。
如果信息在主交流(这词真别扭,你懂得就好)中是次要的,附带的,或者纯粹是为了帮助程序处理主交流,那么使用属性。
这样就避免了将核心内容和附加内容混合在一起。
我见到过很多xml格式,将文档的标题放在属性里边,我认为标题是一个文档中用于交流的很基础的部分,应该总是放在元素里边。
另外也经常见到一些情况,内部的产品Id作为元素被丢进产品的描述信息,我认为属性更合适,读者不会对这些内部的代码感兴趣,尤其是Id很长或者格式不可理解的时候。
你可能听过这样一个更精炼的说法,数据用元素,元数据用属性,就是这个意思。
2.结构化信息原则
当信息需要用结构化的方式来表示,尤其是可能扩展的情况下,使用元素。与之相对的,如果信息是一个原子性记号,使用属性。
日期就是一个好例子,它的结构是固定的,而且通常是作为一个单一记号存在,使用属性是合理的。而人名则相反,人名的结构不是固定的(在某些文化里,
省略尊称或者假定了个部分的顺序可能导致混乱或不敬)。人名也极少是一个原子性的记号,比如说你也许想要按照姓氏排序,也许想要按照名字排序。
另外我得说明,把全名都塞进一个元素里边和把全名用作属性都是有问题的,因此,