DTD 元素属性比较
-
定义和使用
在 XML 中,没有关于何时使用属性以及何时使用子元素的规则。数据可以存储在子元素或属性中。看下面的例子:<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
在第一个示例中,性别是一种属性。 最后,sex 是 child 的元素。 这两个示例提供了相同的信息。没有关于何时使用属性以及何时使用子元素的规则。 经验总结是属性在HTML中很方便,但是在XML中,您应尽量避免使用它们;如果信息感觉像数据,请使用子元素。
-
我最喜欢的方式
我喜欢将数据存储在子元素中。以下三个 XML 文档包含完全相同的信息:在第一个示例中使用 date 属性:<note date="12/08/2020"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>这个周末别忘了我!</body> </note>
在第二个示例中使用 date 元素:<note> <date>12/08/2020</date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>这个周末别忘了我!</body> </note>
在第三个中使用扩展日期元素:<note> <date> <day>12</day> <month>11</month> <year>2002</year> </date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>这个周末别忘了我!</body> </note>
-
避免使用属性?
您应该避免使用属性吗?属性存在的一些问题是:- 属性不能包含多个值(子元素可以)
- 属性不容易扩展(用于将来的更改)
- 属性不能描述结构(子元素可以)
- 程序代码更难以操纵属性
- 属性值不容易针对DTD进行测试
如果将属性用作数据的容器,则最终会导致文档难以阅读和维护;尝试使用元素来描述数据;仅使用属性来提供与数据无关的信息。不要这样结束(这不是应该使用XML的方式):<note day="12" month="08" year="2020" to="Tove" from="Jani" heading="Reminder" body="这个周末别忘了我!"> </note>
-
属性规则例外
规则总是有例外的。我关于属性的规则有一个例外:有时我为元素分配 ID 引用。 这些ID引用可用于访问 XML 元素,其方式与 HTML 中的 NAME 或 ID 属性相同。 此示例说明了这一点:<messages> <note id="p501"> <to>Tove</to> <from>Jani</from< <heading>Reminder</heading> <body>这个周末别忘了我!</body> </note> <note id="p502"> <to>Jani</to> <from>Tove</from> <heading>Re: Reminder</heading> <body>我不会!</body> </note> </messages>
这些示例中的ID只是一个计数器或唯一标识符,用于标识XML文件中的不同注释,而不是注释数据的一部分。这里要说的是元数据(有关数据的数据)应作为属性存储,而数据本身应作为元素存储。