选择哪一个:XML属性或Sub节点?


15

我们希望将数据库中的某些数据导出为XML。例如,Person可以具有agename和其他一些特性。

我们有两种选择来定义XML格式。

选择1:

<Persons>
   <Person>
       <Age>16</Age>
       <Name>Richard</Name>
   </Person>
   <Person>
       <Age>34</Age>
       <Name>Eric</Name>
   </Person>
   ...
</Persons>

选择2:

<Persons>
   <Person Age="16" Name="Richard"/>
   <Person Age="34" Name="Eric"/>
   ...
</Persons>

那么子节点或属性的定义有什么区别?每种选择的好处是什么?



2
尽管这是在2008年的Stack Overflow上提出的,但这似乎是一项设计决策,在此处成为热门话题。
托马斯·欧文斯

Answers:


9

尚无明确的文档/最佳实践,但是请考虑其他方法,因为您有:

作为元素文本:

  • 可以更轻松地将数据显示为xhtml等,其中文本内容被视为文本,而不是标记或元数据。
  • 可以有多个。如果您需要包含多个年龄或姓名行的子内容,则属性将不允许这样做
  • 如果您需要行级元数据,则可以选择使用<name><age>为此目的的属性

作为属性:

  • XML更紧凑
  • XSLT和DocTypes更易于指定
  • 您不必担心空格(填充,缩进,换行符)或其他可在PCDATA区域(元素文本)中引入的项目(注释,PI)
  • 只可以有一个人!您不必担心包含多个age属性的子内容。

我花了很多时间来处理XML,我认为,对于纯数据通信,应尽可能使用属性。如果XML可能用于表示(XSLT,xht​​ml等),则作为文本内容可能会更好(但不一定)。


2
一文不值:如果您要使用XSLT,则实际上没有理由不使用属性。也许如果您打算做一些XML + CSS事情,或者您要使用别人的XSLT ...
DougM 2014年

我添加了一些要点,以使您的好答案更加平衡,希望您同意这会有所改善。
布朗

9

XML设计原则: IBM的Uche Ogbuji 何时使用元素与属性比较可能是这方面的最佳资源之一。

决定的核心是属性是“完成”的事情。您不能更改,修改或嵌套它们。它们是顺序独立的,并且在元素内是不同的(不能有两个相同的东西)。

如果这些约束中的任何约束可能会发生变化,请使数据成为XML的子节点。

在您的示例中,您有一个具有名称和年龄的人。我有名字,中间名和姓氏...还有一个昵称。有些人的姓氏是娘家姓,多个中间名或尊贵名誉-您如何将John Ronald Reuel Tolkien放入这样的结构中?

因此,我们有一个拥有两个中间名的人,这些中间名对他们有顺序。这应该清楚地表明,不,属性不是为此的最佳选择。

我目前无法找到它,但是在上面的链接文档中有一个声明,即名称是需要一些思考的事情,导致“我希望在以后的文章中扩展标记中对人名的处理”。如果有人对此有所帮助,请发表评论或将其编辑到该位置。

另一方面,年龄是具有固定结构的东西(我建议生日而不是整数)。这样,以一种众所周知的和可理解的格式表示该信息在属性中是有意义的。一个人只有一个生日,并且没有一个要保留的“命令”。

Uche Ogbuji确定了正确设计xml格式的三个核心原则。以下是上述链接文档中的缩写引号。

  • 结构化信息的原理
    如果信息以结构化形式表示,尤其是结构可以扩展时,请使用元素。另一方面:如果信息表示为原子标记,请使用属性
  • 可读性原则
    如果要由人阅读和理解信息,请使用元素。如果机器最容易理解和消化信息,请使用属性。
  • 元素/属性绑定的原理
    如果需要其他属性修改元素的值,请使用元素

因此,名称应该是元素-它们是不是原子标记的结构化数据,与计算机相比,它们更容易被人类读取,并且可以通过名称本身的另一个属性进行修改。

日期应该是属性-它们是原子标记的数据,与人类相比,它们更可能被计算机读取(然后在需要时转换为人类的首选格式),最后它们不太可能被其他人修改属性。


2

rolfl的另一个考虑因素是字段数。
超过少数几个属性变得一团糟,并且难以阅读(假设您希望xml对人类可读,但是作为程序员,您至少要进行测试)。

另外,如果您希望其中一个字段的数据结构随时间而改变,请不要将其设为属性。
例如,您的姓名字段。也许将来会变成

<name>
  <firstName>George</firstName>
  <lastName>Orwell</lastName>
  <maidenName></maidenName>
  <nickName>Robert</nickName>
</name>

如果您希望发生类似的事情,将其设置为一个属性将意味着以后需要更多的重构代码。


感谢您的这一点。以及为什么“将其设置为属性意味着以后需要更多重构代码”?
ZijingWu

2

对于人员标签,通常有更多的人员标签是正常的,这很有意义,人员列表具有一些实体,而不是属性。

对于Person及其组件,故事是不同的。一个Person不包含名称,该名称是Person的一个属性,因此我会坚持使用属性而不是新标签。当您有重复性的内容(例如地址),而不能使用属性时,则标记很有用。

如果我们在HTML上下文中考虑,那么您没有带有带有值的名称标签的输入,对吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.