最新的Web开发教程
 

XML元素与属性


在XML中,不存在有关何时使用的属性,以及何时使用子元素的规则。


元素与属性的使用

数据可以存储在子元素或属性。

看看这些例子:

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

在第一例性是一个属性。 在过去,性是一个子元素。 两个例子都提供相同的信息。

没有关于何时使用属性,以及何时使用子元素的规则。 我的经验是属性是方便在HTML中,但在XML中,你应该尽量避免。 使用子元素,如果信息感觉像数据。


我最喜欢的方式

I like to store data in child elements.

下面的三个XML文档包含完全相同的信息:

一个日期属性是在第一实施例中使用:

<note date="12/11/2002">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

一个日期元素在第二个例子中使用:

<note>
  <date>12/11/2002</date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

扩展的日期元素在第三个使用: (THIS IS MY FAVORITE)

<note>
  <date>
    <day>12</day>
    <month>11</month>
    <year>2002</year>
  </date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

避免使用属性?

应避免使用属性?

一些与属性的问题是:

  • 属性不能包含多个值(child elements can)
  • 属性不容易扩展(for future changes)
  • 属性不能描述结构(child elements can)
  • 属性比较难被程序代码操作
  • 属性值是不容易的,以测试针对DTD

如果你使用属性作为数据容器,你最终是难以阅读和维护文档。 尽量使用elements来描述数据。 仅使用属性来提供不相关的数据的信息。

最终不会像这样(this is not how XML should be used)

<note day="12" month="11" year="2002"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>

一个例外,我的属性规则

规则总是有例外。

我的关于属性的规则也有一个例外:

有时候,我分配到的元素ID引用。 这些ID引用可以用来访问XML元素在大致相同的方式名称或ID,在HTML属性。 这个例子说明了这一点:

<messages>
<note id="p501">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

<note id="p502">
  <to>Jani</to>
  <from>Tove</from>
  <heading>Re: Reminder</heading>
  <body>I will not!</body>
</note>
</messages>

在这些实施例中的ID仅仅是一个计数器或一个唯一的标识符,以识别该XML文件中的不同的音符,而不是音符数据的一部分。

我想在这里说的是,元数据(data about data)应当存储为属性,而数据本身应当存储为元素。