Skip to content

XML 属性

XML 元素可以拥有属性(attribute),属性为元素提供了额外的信息。

属性定义在元素的开始标签(start tag)内,由一个名称-值(name-value)对组成。

属性直接在元素的开始标签内指定:

<file type="image/gif" size_kb="15">
computer.gif
</file>
<link rel="stylesheet" href="styles.css"/>

在第一个示例中,type 和 size_kb 是 file 元素的属性。在第二个示例中,rel 和 href 是空 link 元素的属性。

属性通常提供元数据(metadata)(关于元素内容的数据)或配置细节,而不是主要内容本身。

与一些旧的 HTML 做法不同,XML 中的属性值必须总是用引号括起来。

你可以使用单引号(')或双引号(")。选择其中一种并保持一致。

使用双引号:

<person gender="female">

使用单引号:

<person gender='female'>

如果属性值本身需要包含用于括起的引号字符,你必须使用另一种类型的引号或使用字符实体(character entity):

使用交替的引号:

<gangster name='George "Shotgun" Ziegler'>

使用字符实体(&quot; 代表 ",&apos; 代表 '):

<gangster name="George &quot;Shotgun&quot; Ziegler">

一个常见的问题是何时将信息存储为属性,何时存储为子元素。没有单一的严格规则,但这里有一些广泛接受的指南:

考虑以下两种表示相同信息的方式:

使用属性表示 gender:

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

使用元素表示 gender:

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

何时优先使用属性:

  • 元数据(Metadata): 关于元素内容的信息,而不是内容本身(例如,id、status、unit、language)。
  • 简单、原子值(Atomic Value): 不包含子结构或多个值的数据。
  • 标识符(Identifier): 用于引用元素的唯一 ID(标准做法是使用 xml:id)。
  • 配置标志(Configuration Flag): 控制行为的简单布尔值或枚举值。

何时优先使用子元素:

  • 核心内容(Core Content): 元素表示的主要数据。
  • 结构化数据(Structured Data): 具有内部结构的信息(例如,包含街道、城市、邮政编码的地址)。
  • 多个值(Multiple Values): 如果一个项可以出现多次(例如,多个电话号码)。
  • 可读性/可维护性(Readability/Maintainability): 如果在属性中放置过多信息导致开始标签过长且难以阅读。
  • 未来扩展潜力(Future Expansion): 元素通常更容易在以后通过添加更多子元素来扩展。

选项 1:日期作为属性(简单,但结构性较差)

<note date="2024-07-01">
...
</note>

选项 2:日期作为简单元素(分离更清晰)

<note>
<date>2024-07-01</date>
...
</note>

选项 3:日期作为结构化元素(最灵活,最容易解析特定部分)

<note>
<date>
<year>2024</year>
<month>07</month>
<day>01</day>
</date>
...
</note>

最佳选择通常取决于具体上下文以及数据将如何使用。

属性的一个主要用例是存储元数据,例如唯一标识符(unique identifier)。用于此的标准属性是 xml:id。

<?xml version="1.0" encoding="UTF-8"?>
<messages xmlns:xml="http://www.w3.org/XML/1998/namespace">
<note xml:id="msg501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note xml:id="msg502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>

在这里,xml:id 为每个便签(note)提供了一个唯一标识符,它是关于便签的数据,而不是消息内容本身的一部分。这是属性的恰当用法。

总而言之,明智地使用属性表示元数据和简单配置,而优先使用元素表示核心内容和结构化数据。