|
技巧:子元素内容对标记属性--XML格式中的设计问题广告 技巧:子元素内容对标记属性 --XML 格式中的设计问题
演讲者,Gnosis Software, Inc. 2001 年 11 月 在本文中,developerWorks 专栏作家 David Mertz
就何时使用标记属性以及何时使用子元素内容来表示数据提出了一些建议。可以了解到设计 DTD、Schema 或(尤其是)XML
格式所要考虑的事项。您还可以了解到何时属性和内容是可互换的,何时不能。代码样本显示了这些选项。 在交给您要遵守的 XML 方言规范的时候 — 即以 DTD 或者 W3C XML Schema,或者按非正式或按示例所描述的的方式给予您时,您就无须确定使用哪种数据去向哪儿。如果不需要做出选择,则不要理会本文中的建议。但是,开发人员通常需要为过程 设计要使用的、确切的 XML 方言。如果您处于这种情形,则继续读下去。 要记住的一件事情是,那些仅需要良好格式的 XML 文档和那些要求对于某些 DTD/Schema 有效的文档之间的区别。有效性是非常严格的;它允许您坚持以某种方式来表示和结构化某些数据。出于非常一致的原因,确保给定文档生产过程符合有效性需求需要更多的工作。这两种方法都有一些优点;强行使用 DTD 给元素/属性问题添加了复杂性,但在这两种情况中,需要做一些权衡。下面就讨论这些权衡。 数据次序重要吗? 例如,您可能有一个联系人的列表,其中,每个人都必须有姓名、年龄和电话号码。但是,将年龄放在电话号码 前并没有什么逻辑含义。因此,这些属性是无序的。在这种情况中,属性更具有直观性。比较清单 1 和清单 2 中简短的 XML 文档: 清单 1. 联系人的属性数据 <?xml version="1.0"
?> 清单 2. 联系人的子元素数据 <?xml version="1.0" ?> 想象一下由每个 XML 格式所暗示的 DTD。对于清单 1 中面向属性的格式,DTD 可能如清单 3 所示。 清单 3. 联系人文档的属性 DTD <!ELEMENT contacts (contact*)> 做同样事情的面向子元素的 DTD 可能如清单 4 所示。 清单 4. 表示联系人文档的子元素 DTD <!ELEMENT contacts (contact*)> 清单 4 中,DTD 的明显问题是,清单 2 中的这个简单示例在该 DTD 下是无效的(即使它有我们希望的数据)。这些子元素次序是混乱的。副栏显示了如何可以使用带 DTD 的无序子元素。但除非另有一个令人信服的原因,否则,对于无序数据,最好使用属性风格。 多个数据出现在同一层上吗? 然而,在实际情况中,开发人员常常会在制定修正期间逐渐偏离这一设计原则。这里,看一下它是如何发生的:首先,发现有一个 flizbam 附加在每个 Flazbar 后面(并且由数据来描述 flizbam)。好极了,这似乎是一个明显的选择,省去额外冗长的子元素,并为 Flazbar 标记创建 flizbam 属性。这样做不久 — 在为处理 Flazbar 编写好漂亮的生产代码后 — 发现在某些情况下 Flazbar 可以有两个 flizbam。这不是问题:对已安装的代码稍加改动,只需要更改 DTD,使其包含: <!ATTLIST Flazbar flizbam CDATA
#REQUIRED
很难避免被引入这个设计陷阱。数据和对象会随着时间而发展,单个事物会常常成为两个或多个事物。一些 XML 程序员由于这个原因而完全避开了属性,但我认为太过分了。我的建议是,在设计阶段,就单个数据是否在以后需要多个兄弟数据,要仔细考虑。如果未来有多个兄弟数据的合理的可能性,则从一开始就使用子元素。如果有理由确信数据对象将保持唯一,则坚持使用属性。 需要保留空白吗? 如果空白是重要的,则子元素是较佳的选择。例如,如果表示象源代码或诗歌这样空格确实很重要的内容,则坚持使用元素内容。 可读性重要吗? 从个人角度来讲,我发现阅读和编写面向属性的 XML 格式要比面向子元素的容易得多。再看一下上面的清单 1 和清单 2 来体会我所指的含义,没有一个是难以阅读的。但清单 1 的属性版本要更容易阅读些 — 而且也更易于编写,因为不必担心多变的子元素次序。 结束语 请参加关于本文的论坛。 在 Extensible Markup Language (XML) 1.0“W3C 建议书”中有您了解有关 XML 确实需要的任何内容。当然,精确地理解这些含义需要一定的智慧。 XML Cover Pages 有一些关于 Using elements and attributes 的提示。那个页面还包含到一些文章的链接,每篇文章就在确定使用属性还是使用元素时,给出了使用何种标准的矛盾建议。那是我们程序员赚得大把钞票的原因! 查看属性和元素之间差别的一种方式是阅读 "Document-Centric" vs. "Data-Centric" 文档。 查阅在 developerWorks XML 专区上发布的其它 XML
提示。
如果您希望与本文章的作者或其所在机构,进一步交流,请联系:畅享网 姜小姐 jill.jiang@amt.com.cn | 021-51096826-112 | 在线联系 |
CIO职场,强者生存?在2008年,我们将继续看到CIO向商业运营方向发展。与此同时,我们也会看到商业管理人员将与技术管理人员一起竞争CIO岗位。 IT领导者的就职机会虽有不少,但其难度将会大幅提高。2…… |
|
|