XML 属性
XML 元素可以有属性,和 HTML 标签的属性一样
属性(Attribute)提供有关元素的额外信息
XML 属性
HTML 中的 属性提供有关元素的额外信息:
<img src="path_to_image.gif"><a href="link_url.html">
属性通常提供不属于数据组成部分的信息
下面的范例,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要
<file type="gif">computer.gif</file>
XML 属性值必须加引号
属性值必须被引号包围,既可以使用单引号,也可以使用双引号
比如一个人的性别,person 元素可以这样写
<person sex="female">
或者这样
<person sex='female'>
如果属性值本身包含双引号,可以使用单引号
<gangster name='George "Shotgun" Ziegler'>
或者使用字符实体
<gangster name="George "Shotgun" Ziegler">
XML 元素 vs. 属性
先来看两个 XML 文档
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
sex 是一个属性 sex 是一个元素
这两个范例都提供相同的信息
XML 推荐标准 没有什么规定可以告诉我们什么时候该使用属性,而什么时候该使用元素
但我们的实战经验是
- HTML 中,属性用起来很便利
- XML 中,应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧
我最喜欢的方式
下面的三个 XML 文档包含完全相同的信息:
写情书的日期应该是最重要的,因为日思夜想,所谓属性,它只是标识情书的日期而已
这个使用了 date 属性
<note date="2017-10-18"> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you so much</body> </note>
这个使用了 date 元素 (这是我的最爱)
<note> <date>2017-10-18</date> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you so much</body> </note>
这个使用了扩展的 date 元素
太臃肿了
<note> <date> <day>18</day> <month>10</month> <year>2017</year> </date> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you so much</body> </note>
避免 XML 属性?
使用属性可能会引起的一些问题:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不容易扩展(为未来的变化)
属性难以阅读和维护
请尽量使用元素来描述数据,而仅仅使用属性来提供与数据无关的信息。
记住,千万不要做这样的蠢事 (这不是 XML 应该被使用的方式 )
<note day="18" month="10" year="2017"> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you so much</body> </note>
针对元数据的 XML 属性
有时候会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素,它起作用的方式与 HTML 中 id 属性是一样的
比如
<message> <note id="520"> <date>2017-10-18</date> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you so much</body> </note> <note id="512"> <date>2017-10-17</date> <to>小明</to> <from>小红</from> <heading>短信</heading> <body>I miss you today</body> </note> </message>
上面的 id 属性仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分
标签 VS 属性最佳实战
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素