Atom文書の拡張のしかたについて。

Atomのスキーマを見ていて、Atomの拡張方法が厳密に決まっていることを知った。別の名前空間を指定すれば自由に拡張できるのかと思っていた。

Atomマークアップを拡張するための明確に定義されたモデルがある。このモデルでは、明確な仕様により、拡張要素を置くことが可能な場所とそうでない場所が規定され、拡張における言語依存(とxml:lang属性に影響される部分)が明確に識別され、Atomパーサやハンドラーが、マークアップ内で未知または既知の拡張を発見した場合、どのような対応を取るべきかが記述されている。

後発XMLフィード形式「Atom」とは − TechTargetジャパン システム開発

拡張の書き方には3種類ある。スキーマでいうところの、

  • (ア) (text|anyElement)*
  • (イ) (text|anyForeignElement)*
  • (ウ) extensionElement*

の3通り。以下の3つの点で異なる。

  • Atom要素を書けるかどうか。
  • 属性も内容もない要素をかけるか。
  • テキストを書けるか。
種類 Atom要素許可 属性無しの空要素可 テキスト可
(ア)
(イ) ×
(ウ) × × ×

Atom要素が不可の位置にAtom要素を書きたかったら、独自要素を挟む。独自要素の下にならAtom要素を書いても良い。

<my:feedlist>
  <feed><!-- 略 --></feed>
  <feed><!-- 略 --></feed>
</my:feedlist>
<my:idlist>
  <id>tag:example.com,2010:111</id>
  <id>tag:example.com,2010:222</id>
  <id>tag:example.com,2010:333</id>
</my:idlist>

(ア)~(ウ)が書ける場所は次の通り。

  • (ア) atom要素を含む要素やテキストを何でも書ける。
    • atom:contentのtype(MediaType)がxmlなとき。 (4.1.3.3. #4)
  • (イ) atom要素は書けない。他は何でも書ける。
    • atom:category
    • atom:link
  • (ウ) atom要素不可。テキスト不可。<br />みたいに内容も属性もない要素は不可。(6.4)
    • atom:author
    • atom:contributor
    • atom:feed
    • atom:entry
    • atom:source

拡張した属性はAtom要素のどれにでも書ける。

拡張関連のスキーマ

# Simple Extension

simpleExtensionElement =
   element * - atom:* {
      text
   }

# Structured Extension

structuredExtensionElement =
   element * - atom:* {
      (attribute * { text }+,
         (text|anyElement)*)
    | (attribute * { text }*,
       (text?, anyElement+, (text|anyElement)*))
   }

# Other Extensibility

extensionElement =
   simpleExtensionElement | structuredExtensionElement

undefinedAttribute =
  attribute * - (xml:base | xml:lang | local:*) { text }

undefinedContent = (text|anyForeignElement)*

anyElement =
   element * {
      (attribute * { text }
       | text
       | anyElement)*
   }

anyForeignElement =
   element * - atom:* {
      (attribute * { text }
       | text
       | anyElement)*
   }