コードを書いていて、一番嫌いな作業がXMLのパースだったりする。 できることなら一生パーサを書きたくないので、気合をいれてちょっと汎用的なパーサを書いてみた。 通常の商業案件で使う程度のXMlパースなら、このクラス使えば余裕でパースできる。以下ざっと使い方。
SimpleXMLParserは、XMLのノード名を基準にどのようにパースするかを指定できるパーサークラス。 以下のように関数、addNodeDefinitionを使って、このノードはString、このノードはArrayといった具合にパース方法を定義できる。 さらに、このノードはSpriteのインスタンスを生成しプロパティに注入・・・といったことも可能。
百聞は一見にしかずなので、如何SimpleXMLParserで、ざっと簡単なXMLのパースをしてみた。
var xml:XML = <items> <item> <title>Item001</title> <tags>flash,as3,test</tags> <view> <x>100</x> <y>100</y> </view> <rand>10</rand> </item> </items> var parser:SimpleXMLParser = new SimpleXMLParser(); //まずノード毎の定義をずらずらっと書く。 //itemsノードはArrayとして扱う parser.addNodeDefinition("items", SimpleXMLParser.ARRAY); //itemノードはObjectとして。 parser.addNodeDefinition("item", SimpleXMLParser.OBJECT); //titleノードはStringとして扱う parser.addNodeDefinition("title", SimpleXMLParser.STRING); //tagsノードは、コンマで分割した配列として扱う。 parser.addNodeDefinition("tags", SimpleXMLParser.SPLITED_STRING_ARRAY, ","); //viewノードはスプライトとして生成し、xノード, yノードをプロパティとして代入 parser.addNodeDefinition("sprite", SimpleXMLParser.CLASS_INSTANCE, Sprite); parser.addNodeDefinition("x", SimpleXMLParser.Number);. parser.addNodeDefinition("y", SimpleXMLParser.Number); //randノードは、クロージャを使って独自に処理を定義 parser.addNodeDefinition("rand), SimpleXMLParser.FUNCTION, function(node:XML, rule:Object):void{ return Math.random() * Number(node.text());} ); //これでパース完了♪ var result:Object = parser.parse(xml);
といった感じで、わざわざクラスを作らなくても挙動を列挙するだけで、単純なXMLなら一発パースできる。 namespaceやattributeのある場合はちょっと対応していないのだけど、それでも クロージャを使って独自パースを定義すれば十分対応できる。
まぁそんな感じ、これで簡単なXMLなら二度とパースかかなくてすむ。わーい。