forked from: XML再帰読み込みサンプル

by fujiopera forked from XML再帰読み込みサンプル (diff: 2)
wonderfl練習 有効プログラム
♥0 | Line 58 | Modified 2011-08-24 10:28:16 | MIT License
play

ActionScript3 source code

/**
 * Copyright fujiopera ( http://wonderfl.net/user/fujiopera )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/eBcW
 */

// forked from vinylsheet's XML再帰読み込みサンプル
/*********************************************************
 * XMLクラスの構造は
 * XML.children() → XMLList
 * XMLList[n] → XML
 * となっているので、こんな風に取得できるという小ネタ。
 *********************************************************/
package {
    import flash.events.Event;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            var txt:TextField = new TextField();
            txt.autoSize = TextFieldAutoSize.LEFT;
            txt.text = xmlTracer(XML(XML_DATA));
            addChild(txt);
        }

        private static const XML_DATA:String =
            "<?xml version=\"1.0\" encoding=\"shift-jis\" ?>" + "\n" +
            "<root>" + "\n" +
            "  <hoge />" + "\n" +
            "  <employees type=\"Array\">" + "\n" +
            "    <item type=\"Object\">" + "\n" +
            "      <id type=\"String\" primary=\"true\">1234567890</id>" + "\n" +
            "      <name type=\"String\">東京太郎</name>" + "\n" +
            "    </item>" + "\n" +
            "    <item type=\"Object\">" + "\n" +
            "      <id type=\"String\" primary=\"true\">12345ABCDE</id>" + "\n" +
            "      <name type=\"String\">深澤 快生</name>" + "\n" +
            "    </item>" + "\n" +
            "  </employees>" + "\n" +
            "  <employees type=\"Array\">" + "\n" +
            "    <item type=\"Object\">" + "\n" +
            "      <id type=\"String\" primary=\"true\">ABDEFGHIJKLMN</id>" + "\n" +
            "      <name type=\"String\">アンゴラ共和国太郎</name>" + "\n" +
            "    </item>" + "\n" +
            "  </employees>" + "\n" +
            "</root>";

        private function xmlTracer(xml:XML, nest:uint = 0):String
        {
            var i:uint;
            var result:String = "";
            // インデント処理
            for (i = 0; i < nest * 2; i++) result += " ";
            // xml.nameがある場合はブロックが存在している
            if (xml.name()) {
                // タグ名取得
                result += "<" + xml.name().toString();
                // 属性名・値取得
                for each (var attr:XML in xml.attributes())
                    result += " " + attr.name().toString() + "=\"" + attr.toString() + "\"";
                // 子がある場合は再帰
                if (xml.children().length() > 0) {
                    // タグ末尾設定
                    result += ">\n";
                    for each (var child:XML in xml.children())
                        result += xmlTracer(child, nest + 1);
                    // インデント処理
                    for (i = 0; i < nest * 2; i++) result += " ";
                    // タグ閉じる
                    result += "</" + xml.name().toString() + ">\n";
                }
                // 子がいない場合はタグを一行で閉じる
                else
                    result += " />\n"
            }
            // xml.nameがない場合は値のみとみなす
            else
                result += xml.toString() + "\n";
            return result;
        }
    }
}