XML属性与元素

什么时候应该使用XML属性,什么时候应该使用XML元素?

例如

<customData> <records> <record name="foo" description="bar" /> </records> </customData> 

要么

 <customData> <records> <record> <name>foo</name> <description>bar</description> </record> </records> </customData> 

在IBM网站上有一篇题为“ XMLdevise原则:何时使用元素与属性 ”的文章。

虽然看起来没有很多硬性规定,但是在这个post里有一些很好的指导方针。 例如,其中一个build议是在您的数据不能用于空白空间标准化时使用元素,因为XML处理器可以规范化属性中的数据,从而修改原始文本。

当我开发各种XML结构时,我发现自己偶尔会提及这篇文章。 希望这对其他人也有帮助。

编辑 – 来自网站:

核心内容的原则

如果您认为所涉及的信息是以XML表示或传达的基本材料的一部分,则将其放入一个元素中。 对于人类可读的文档,这通常意味着正在传达给读者的核心内容。 对于面向机器的logging格式,这通常意味着直接来自问题域的数据。 如果您认为这些信息是主要通信的外围或附带信息,或纯粹旨在帮助应用程序处理主要通信,请使用属性。 这样可以避免用辅助材料混淆核心内容。 对于面向机器的logging格式,这通常意味着来自问题域的主要数据的特定于应用程序的记号。

作为一个例子,我看到了很多XML格式,通常是在企业中种植的,文档标题被放置在属性中。 我认为标题是文档通信的基础部分,应该始终处于元素内容中。 另一方面,我经常看到内部产品标识符作为产品描述logging的元素。 在这些情况中的某些情况下,属性更合适,因为特定的内部产品代码对于大多数读者或者文档的处理者来说不是主要的兴趣,特别是当ID是非常长或者不可理解的格式时。

您可能已经听到了元素中的原则数据,属性中的元数据。 上述两段实际上expression了相同的原则,但是更多的是用语言模糊的语言。

结构化信息原理

如果信息以结构化的formsexpression,特别是如果结构可以是可扩展的,则使用元素。 另一方面:如果信息表示为primefaces标记,则使用属性。 元素是在XML中expression结构的可扩展引擎。 几乎所有的XML处理工具都是围绕着这个事实而devise的,如果你把结构化的信息正确地分解成元素,你会发现你的处理工具可以补充你的devise,从而提高生产力和可维护性。 属性被devise用于表示元素中表示的信息的简单属性。 如果您通过将结构化信息绑定到属性来反对XML的基本架构,您可能会获得一些似是而非的简洁和方便,但您可能会付出维护成本。

date是一个很好的例子:date具有固定的结构,通常作为一个单一的标记,所以它作为一个属性是有意义的(最好用ISO-8601表示)。 另一方面,代表个人名字就是我见过这个原则让devise师惊喜的一个例子。 我在属性中看到很多名字,但是我一直认为个人名字应该在元素内容中。 个人的名字有着令人惊讶的变化结构(在某些文化中,你可以通过省略敬语或者命名部分命令来引起混淆或冒犯)。 个人名字也很less是一个primefaces标记。 作为一个例子,有时你可能想要search或按姓氏sorting,有时候也可以按姓氏sorting。 我应该指出,把全名放在单个元素的内容中就像置入一个属性一样是有问题的。

英国的GovTalk指导原则是其中一个较好的思维元素与属性争论。 这就定义了与政府有关的XML交换所使用的build模技术,但是它的优点是值得考虑的。

模式必须被devise成元素是XML实例中信息内容的主要持有者。 属性更适合于保存辅助元数据 – 提供有关元素内容的更多信息的简单项目。 属性不得用于限定其他可能导致歧义的属性。

与元素不同,属性不能保存结构化数据。 出于这个原因,元素被视为信息内容的主要持有者。 但是,允许使用属性来保存关于元素内容的元数据(例如,date格式,度量单位或值集的标识)可以使实例文档更简单易懂。

出生date可以在消息中表示为:

  <DateOfBirth>1975-06-03</DateOfBirth> 

但是,可能需要更多信息,例如如何确认出生date。 这可以被定义为一个属性,使消息中的元素如下所示:

 <DateOfBirth VerifiedBy="View of Birth Certificate">1975-06-03</DateOfBirth> 

以下是不合适的:

 <DateOfBirth VerifiedBy="View of Birth Certificate" ValueSet="ISO 8601" Code="2">1975-06-03</DateOfBirth> 

这里不清楚代码是否符合VerifiedBy或ValueSet属性。 更合适的引用是:

  <DateOfBirth> <VerifiedBy Code="2">View of Birth Certificate</VerifiedBy> <Value ValueSet="ISO 8601">1975-06-03</Value> </DateOfBirth> 

我个人喜欢使用简单的单值属性的属性。 元素(显然)更适合于复杂types或重复值。

对于单值属性,在大多数API中属性导致更紧凑的XML和更简单的寻址。

这主要是一个偏好问题。 我使用元素进行分组和属性的数据在可能的情况下,因为我认为这是比替代更紧凑。

比如我比较喜欢…..

 <?xml version="1.0" encoding="utf-8"?> <data> <people> <person name="Rory" surname="Becker" age="30" /> <person name="Travis" surname="Illig" age="32" /> <person name="Scott" surname="Hanselman" age="34" /> </people> </data> 

…代替….

 <?xml version="1.0" encoding="utf-8"?> <data> <people> <person> <name>Rory</name> <surname>Becker</surname> <age>30</age> </person> <person> <name>Travis</name> <surname>Illig</surname> <age>32</age> </person> <person> <name>Scott</name> <surname>Hanselman</surname> <age>34</age> </person> </people> </data> 

但是,如果我有20-30个字符或者包含很多引号或其他字符需要转义的数据,那么我想说是时候分解元素了……可能是用CData块。

 <?xml version="1.0" encoding="utf-8"?> <data> <people> <person name="Rory" surname="Becker" age="30" > <comment>A programmer whose interested in all sorts of misc stuff. His Blog can be found at http://rorybecker.blogspot.com and he's on twitter as @RoryBecker</comment> </person> <person name="Travis" surname="Illig" age="32" > <comment>A cool guy for who has helped me out with all sorts of SVn information</comment> </person> <person name="Scott" surname="Hanselman" age="34" > <comment>Scott works for MS and has a great podcast available at http://www.hanselminutes.com </comment> </person> </people> </data> 

作为一般规则,我完全避免了属性。 是的,属性更紧凑,但元素更灵活,灵活性是使用像XML这样的数据格式的最重要的优点之一。 今天什么是单一价值可以成为明天的价值清单。

而且,如果所有东西都是一个元素,那么您永远不必记住您是如何build模任何特定的信息的。 不使用属性意味着你有一件事情要考虑。

通过Ned Batchelder查看元素与属性 。

很好的解释和元素和属性的优点和缺点。

他把它归结为:

build议:对将由业务应用程序生成或使用的数据使用元素,并为元数据使用属性。

重要提示:请参阅下面的@ maryisdead评论以作进一步澄清。

对属性的限制告诉你在哪里可以使用它们,属性名称必须是唯一的,它们的顺序不能是重要的,名称和值都只能包含文本。 相比之下,元素可以具有不唯一的名称,具有显着的sorting,并且可以具有混合的内容。

属性可用于映射到遵循这些规则的数据结构的域中:对象上的属性的名称和值,表的一行中的列,字典中的条目的属性。 (但是,如果属性不是全部值types,或者字典中的条目不是string,则不适用。)

我个人的经验法则是:如果一个元素只能包含其中一个元素,并且它包含一个primefaces数据(id,name,age,type等等),那么它应该是一个属性,否则就是一个元素。

当数据是人类读者需要知道的数据时,我倾向于使用元素,而当它仅用于处理时(例如,ID),就会使用这些元素。 这意味着我很less使用属性,因为大部分数据都与正在build模的域相关。

下面是另一个可以帮助区分元素和属性的策略:思考对象并记住MVC。

对象可以有成员(对象variables)和属性(成员有setter和getter)。 属性在MVCdevise中非常有用,允许更改通知机制。

如果这是所采取的方向,则属性将被用于不能被用户改变的内部应用程序数据; 经典示例将是ID或DATE_MODIFIED。 因此元素将被用于可以被用户修改的数据。

因此,考虑到图书pipe理员首先添加一个图书项目(或一本杂志),然后可以编辑它的名字作者ISBN等:

 <?xml version="1.0" encoding="utf-8"?> <item id="69" type="book"> <authors count="1"> <author> <name>John Smith</name> <author> </authors> <ISBN>123456790</ISBN> </item>