XML 要素 対 属性
XMLには、いつ属性を使用するか、そしていつ子要素を使用するかに関する規則がありません。
要素対属性の使用
データは子要素または属性に格納できます。
こちらの例を見てください:
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
|
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
|
最初の例で、sexは属性です。後の例では、sexは子要素です。両方の例は同じ情報を提供します。
いつ属性を使用するか、そして、いつ子要素を使用するかに関しての規則がありません。 私の経験では、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は、ただ note データの一部ではなく、XMLファイルでの異なった note を識別するためのカウンタ、またはユニークな識別子です。
私がここで言おうとしていることは、メタデータ(データに関するデータ)は属性として格納されるべきであり、データ自体は要素として格納されるべきであるということです。
|