XMLの属性

XML要素は開始タグに属性を含むことができます。HTMLと同様です。

属性(Attribute)は要素に関する追加情報を提供します。

XML属性には引用符が必要です

属性値は引用符で囲まなければなりませんが、シングルクォートとダブルクォートのどちらも使用できます。

例えば、人の性別を表す場合、<person>タグは以下のように書かれます:

<person gender="female">

または以下のようにもできます:

<person gender='female'>

属性値が双引号を含む場合、シングルクォートを使用できます。以下の例を参照してください:

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

またはキャラクターエンティティを使用できます:

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

XML要素と属性

これらの例を確認してください:

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

第1つの例では、sexは属性です。第2つの例では、sexは子要素です。両方の例は同じ情報を提供できます。

XMLには、属性を使用するか子要素を使用するかを決定するルールはありません。私の経験では、HTMLでは属性が便利ですが、XMLでは属性の使用を避けるべきです。情報がデータのように感じる場合は、子要素を使用してください。

私が好きな方法

以下の3つのXMLドキュメントは、完全に同じ情報を含んでいます:

第1つの例では、date属性を使用しています:

<note date="2008-01-10">
  <to>George</to>
  <from>John</from>
</note>

第2つの例では、<date>要素を使用しています:

<note>
  <date>2008-01-10</date>
  <to>George</to>
  <from>John</from>
</note>

第3つの例では、拡張されたdate要素を使用しています(これは私の大好きなものです):

<note>
  <date>
    <year>2008</year>
    <month>01</month>
    <day>10</day>
  </date>
  <to>George</to>
  <from>John</from>
</note>

属性を使用しないことを避けるべきですか?

属性を使用する際に考慮すべきいくつかの点は:

  • 属性には複数の値を含むことができません(要素はできます)
  • 属性は木構造を説明することができません(要素はできます)
  • 属性は拡張しにくい(将来の変更のために)

データを説明するために要素をできるだけ使用してください。属性を使用してデータに関係のない情報を提供するだけでなくです。

こんな愚かなことをしないでください(これはXMLが使われるべき方法ではありません):

<note day="10" month="01" year="2008"
to="George" from="John" heading="Reminder"
body="Don't forget the meeting!"
</note>

メタデータのXML属性

時々、要素にIDを割り当てることがあります。これらのIDインデックスは、XML要素を識別するために使用され、HTMLのID属性と同じように機能します。この例では、そのような状況を示しています:

<messages>
  <note id="501">
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
  </note>
  <note id="502">
    <to>John</to>
    <from>George</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note> 
</messages>

上記の ID は、異なるタグを識別するための識別子に過ぎず、タグデータの一部ではありません。

ここで強く伝えたい理念は、メタデータ(データに関するデータ)は属性として、データ自体は要素として保存されるべきです。