月別アーカイブ: 2015年3月

XMLのCDATAの誤用

XMLの愚痴。
xmlcdata
<name>というタグを考える。①のような。データをタグの内容として持つ。
これを読みやすくしたいからと②のように改行&インデントしちゃうと問題が起こる。
タグの内容は開始タグの直後から終了タグの直前まで、赤い矢印のところから青い矢印のところまでを指すので、”名前” だけでなくその前後の改行やらインデントした空白文字も内容として扱われてしまう。

まあ常識ですよね。そんなこと改めて言うことじゃないですよね。

さて次。

このようなタグの場合、中身をCDATAセクションで囲うことがよくある。③みたいに。

ここで。CDATAセクションとは、タグの内容の中の <![CDATA[ で始まり、 ]]> で終わる区間(=セクション)、について、この中の文字列はマークアップや実体参照や文字参照として扱わない、というものだ。

え、これも今さら改まって言うなって? ごもっとも。

で。

ここで。

問題なのが、上の画像の ④ 。

これ、パッと見て、「変」って思わなかった人。  アウト。

アウトおおおおおおおおおおおお!!!!!!!!

タグの内容にCDATAがあろうがなかろうが、タグの中身は開始タグの直後から終了タグの直前までなのですよ。④の場合でも赤矢印から青矢印までが、nameタグの中身。④の場合、nameタグの中身が、CDATAより前の通常区間と、CDATA区間と、CDATAより後の通常区間、の3つの区間=セクションでできてるワケ。CDATAで括ったからといって、「タグの中身がCDATAの内部だけに限定される」なんて、どこにも書いてないでしょ? わざわざCDATAセクションと、セクションって言葉がついてる意味を考えてね。うん。

タグの中身に、2つ以上のCDATAセクションを入れたって構わない。意味があるかは知らんけど
<name><![CDATA[名]]><![CDATA[前]]></name>
は、
<name>名前</name>
に同じ。普通のセクションとCDATAセクションを混ぜて
<name>名<![CDATA[前]]></name>
にしても同じ。上の3つは全部同じ内容。

CDATAで囲ってもその外側の部分もタグの内容だから! 改行入れんな!! インデントすんな!!!

XML系のGPXとかKMLとかを吐くプログラム、特に個人が作成したWindwos用のユーティリティソフト系で、④の「改行+インデント+CDATA」を吐く困ったやつが、稀によくある。勘弁して欲しいものである。
ユーザから「無駄な空白がくっつく」と怒られるのはそれを読むアプリの方なのだ。

XMLについて説明している個人サイトなんかでも④の形式で書いてるものがある。改行とインデント入れないと見づらいってのは判るけど困ったものである。