XML 元素 vs. 属性
在 XML 中,没有关于何时使用属性以及何时使用子元素的规则。
元素 vs. 属性的使用
数据可以存储在子元素或属性中。
看看这些例子
<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 文档包含完全相同的信息
在第一个例子中使用了一个 date 属性
<note date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>提醒</heading>
<body>这个周末别忘了我!</body>
</note>
在第二个例子中使用了一个 date 元素
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>提醒</heading>
<body>这个周末别忘了我!</body>
</note>
在第三个例子中使用了一个扩展的 date 元素:(这是我最喜欢的)
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>提醒</heading>
<body>这个周末别忘了我!</body>
</note>
避免使用属性?
你应该避免使用属性吗?
属性的一些问题是
- 属性不能包含多个值(子元素可以)
- 属性不容易扩展(对于未来的更改)
- 属性不能描述结构(子元素可以)
- 属性在程序代码中更难操作
- 属性值不容易针对 DTD 进行测试
如果你使用属性作为数据的容器,你最终会得到难以阅读和维护的文档。尝试使用 元素来描述数据。仅在提供与数据无关的信息时才使用属性。
不要像这样结束(这不是 XML 的使用方式)
<note day="12" month="11" year="2002"
to="Tove" from="Jani" heading="提醒"
body="这个周末别忘了我!">
</note>
我的属性规则的例外
规则总是会有例外。
关于属性的规则有一个例外
有时我会为元素分配 ID 引用。这些 ID 引用可以用来访问 XML 元素,就像 HTML 中的 NAME 或 ID 属性一样。这个例子演示了这一点
<messages>
<note id="p501">
<to>Tove</to>
<from>Jani</from>
<heading>提醒</heading>
<body>这个周末别忘了我!</body>
</note>
<note id="p502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: 提醒</heading>
<body>我不会!</body>
</note>
</messages>
这些例子中的 ID 只是一个计数器或一个唯一标识符,用于识别 XML 文件中的不同注释,而不是注释数据的一部分。
我想说的是,元数据(关于数据的数据)应该存储为属性,而数据本身应该存储为元素。