XMLパーサとCDATA参照方法-Flash/AS3.0
Flash制作時のActionScript3.0で、RSSファイルなどの外部XMLデータをパース際に、他のCMSなどから出力されたXMLデータ内にCDATAで囲まれたノードがある場合があります。
この場合CDATA内は単純な文字列として扱われるため、XMLの階層構造として参照することができません。
なのでCDATA内のタグを参照する場合は、文字参照もしくは実体参照としてタグや値を参照することになります。
【CDATAセクションで参照できない例】
<content>
<![CDATA[
<div>落ち着きのないゴリラ</div>
<div>流れつづける河童</div>
]]>
</content>
content.toStringなどで参照すると、CDATA内の値は所得できます。ところがXMLノードとしては、content.divやcontent.pなどの参照はできなくなります。
CDATAによって文字列として扱われていて、HTML形式とXML形式の違いのためです。
CDATAセクションを外せば問題ないのですが、出力元はいろいろになるわけですから、FlashのActionScript3.0でセクション部分の対応をするのが現実的だとして、
対処をまとめてみました。
結局、新規テキストフィールドにCDATAセクションの上のノードを指定して代入して文字列をテキストフィールドに渡す。
テキストフィールドの値を、XML形式で再度代入して、appnedChildでXMLノードとして再度追加してあげることで、XMLノードとして参照可能になります。
他にもやり方はあると思いますが、とにかくCDATAで文字列になったデータをXMLに戻してあげる工程をふめば参照してノード値を取得することが可能になります。
【XMLデータのCDATAセクションの参照と抽出方法】
xmlデータcontentタグ以下にCDATAで文字列のHTMLタグDIVを参照するとき。
imgTxtのテキストフィールド(htmlText)を用意して、すでにXMLデータはwh_xmlに変換されているものとします。
imgTxt.text = wh_xml.channel.item.content;
var imgDIV:XML = XML(imgTxt.text);
wh_xml.channel.item.content.appendChild(imgDIV);
trace("DIVタグ以下のノード"+ wh_xml.channel.item[i].content.div);
ただし、CDATA内のタグ構造は整形式(規則的な構造)でないとコンパイルエラーで取得ができなくなります。
【例:○】
<div><img /></div>
<div><img /></div>
【例:×】
<div><img /></div>
<p><img /></p>