DTD 元素 vs. 属性

创建于 2024-12-03 / 20
字体: [默认] [大] [更大]

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


元素与属性的使用

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

看看这些例子:

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

在第一个例子中,sex 是一个属性。最后,sex 是一个子元素。这两个实例提供了相同的信息。

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


我最喜欢的方式

我喜欢将数据存储在子元素中。

以下三个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>

扩展的日期元素用于第三个元素:(这是我最喜欢的):

<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>

避免使用属性?

你应该避免使用属性吗?

属性的一些问题是:

  • 属性不能包含多个值(子元素可以)
  • 属性不易扩展(用于将来的更改)
  • 属性不能描述结构(子元素可以)
  • 属性更难被程序代码操纵
  • 属性值不容易根据DTD进行测试

如果使用属性作为数据的容器,那么最终会得到难以读取和维护的文档。尝试使用元素来描述数据。使用属性只能提供与数据无关的信息。

不要以这种方式结束(这不是XML的使用方式):

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

我的属性规则的一个例外

规则总是有例外的。

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

有时我给元素指定ID引用。这些ID引用可用于访问XML元素,其方式与HTML中的NAME或ID属性大致相同。这个例子说明了这一点:

<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文件中的不同注释,而不是注释数据的一部分。

我想说的是,元数据(关于数据的数据)应该存储为属性,而数据本身应该存储为元素。



0 人点赞过