Atom文書の拡張のしかたについて。
Atomのスキーマを見ていて、Atomの拡張方法が厳密に決まっていることを知った。別の名前空間を指定すれば自由に拡張できるのかと思っていた。
- RFC 4287 - The Atom Syndication Format
- http://atompub.org/2005/08/17/atom.rnc
- スキーマ。RFC4287のAppendix Bと同じもの。
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)* }