XML要素と属性
XMLでは、いつ属性を使用するか、いつ子要素を使用するかについての規則はありません。
要素と属性の使用
データは子要素または属性に保存できます。
これらの例を見てください。
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
最初の例では、性別は属性です。最後に、セックスは子供の要素です。どちらの例も同じ情報を提供します。
属性をいつ使用するか、および子要素をいつ使用するかについての規則はありません。私の経験では、属性はHTMLでは便利ですが、XMLでは避けてください。情報がデータのように感じられる場合は、子要素を使用します。
私の好きな方法
子要素にデータを保存するのが好きです。
次の3つのXMLドキュメントには、まったく同じ情報が含まれています。
最初の例では、日付属性が使用されています。
<note date="12/11/2002">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2番目の例では、日付要素が使用されています。
<note>
<date>12/11/2002</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
展開された日付要素が3番目に使用されます:(これは私のお気に入りです):
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
属性の使用を避けますか?
属性の使用を避けるべきですか?
属性に関する問題のいくつかは次のとおりです。
- 属性に複数の値を含めることはできません(子要素は含めることができます)
- 属性は簡単に拡張できません(将来の変更のために)
- 属性は構造を記述できません(子要素は記述できます)
- 属性はプログラムコードで操作するのがより困難です
- 属性値をDTDに対してテストするのは簡単ではありません
データのコンテナとして属性を使用すると、ドキュメントの読み取りと保守が困難になります。要素を使用してデータを記述してみてください。属性は、データに関連しない情報を提供する場合にのみ使用してください。
このようになってはいけません(これはXMLの使用方法ではありません):
<note day="12" month="11" year="2002"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
属性ルールの例外
ルールには常に例外があります。
属性に関する私のルールには1つの例外があります。
時々私は要素にID参照を割り当てます。これらのID参照は、HTMLのNAMEまたはID属性とほぼ同じ方法でXML要素にアクセスするために使用できます。この例はこれを示しています:
<messages>
<note id="p501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="p502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not!</body>
</note>
</messages>
これらの例のIDは、メモデータの一部ではなく、XMLファイル内のさまざまなメモを識別するための単なるカウンターまたは一意の識別子です。
ここで私が言おうとしているのは、メタデータ(データに関するデータ)は属性として保存する必要があり、データ自体は要素として保存する必要があるということです。