Posted By

daisuke103 on 02/11/08


Tagged

parse textmate original xml as2


Versions (?)

AS2 XMLパース 回帰処理


 / Published in: Other
 

  1. /* ここから */
  2. //XMLのロード
  3. var infoXML = new XML();
  4. var xmlData = new Array();//XMLデータを格納する配列
  5. // 改行などの空白を無視
  6. infoXML.ignoreWhite = true;
  7. infoXML.onLoad = function(success) { parseDataXML(success ? this : null);}
  8. infoXML.load("/* XMLのファイルパス */");
  9.  
  10.  
  11. // ---- XML解析
  12. function parseDataXML(infoXML) {
  13. if (!infoXML) {
  14. trace("XML読み込みエラー");
  15. return;
  16. }
  17. //解析実行
  18. procParseDataXML(infoXML, xmlData, "", "");
  19.  
  20. /* ------ 処理後のスクリプトはここ以下に記載 ------ */
  21.  
  22. /* ------ 処理後のスクリプトここまで ------ */
  23. }
  24.  
  25. // ---- 回帰処理
  26. function procParseDataXML(xmldata:XML, arraydata:Array, arraystr:String, shortcut:String){
  27.  
  28. /* ------ 設定 ------ */
  29.  
  30. //ユニーク属性
  31. var unique_on:Boolean = true; //ユニーク属性をセットする時はtrue,使わない時はfalse
  32. var unique:String = "id"; //ユニーク属性設定
  33. //ガイド出力
  34. var guide:Boolean = true; //変数のパスを出力する時はコメントアウト
  35. //ダブり防止番号自動付加オン
  36. var dub_on:Boolean = true; //ダブり防止機能(_2,_3…)をオフにする時はfalse
  37.  
  38. /* ------ 設定ここまで ------ */
  39. /**
  40. usage
  41. ・各要素名はピリオドでつなぐ
  42. ・トップ要素から順にxmlData['第1要素名.第2要素名.第3要素名']と続く
  43. ・同階層に同じ要素名が2つ以上存在するとき、2つ目以降は自動的に要素名の後に_2,_3…と付く
  44. ・要素にユニーク属性が含まれる場合はxmlData['第1要素名.第2要素ユニーク名属性値.第3要素名']
  45. ・ユニーク属性値が重複する時は2つ目以降自動的に_2,_3…と付く xmlData['第1要素名.第2要素ユニーク名属性値_2.第3要素名']
  46. ・attributesの値は該当する要素@属性名
  47. ・要素が存在する階層の要素の数(Number)はxmlData['第1要素名.第2要素名.第3要素名->max']
  48. ・同階層の頭から数えて該当する要素の順番(Number)はxmlData['第1要素名.第2要素名.第3要素名->num']
  49. ・ショートカットパスは1から数えた順番をピリオドでつなぐ
  50. **/
  51.  
  52. var arraystr_ext:String;
  53. var arraySum:String;
  54. var scSum:String;
  55. for(var i:Number=0 ; i < xmldata.childNodes.length ; i++){
  56.  
  57. //要素名
  58. arraystr_ext = xmldata.childNodes[i].nodeName;
  59.  
  60. //ダブりを防止
  61. if(arraydata[arraystr + '.' + arraystr_ext] != undefined && dub_on){
  62. var w = 2;
  63. while(arraydata[arraystr + '.' + arraystr_ext + '_' + w] != undefined){
  64. w++;
  65. }
  66. arraystr_ext += "_" + w;
  67. }
  68.  
  69. //パスを決定
  70. arraySum = arraystr + "." + arraystr_ext;
  71.  
  72. //最初の"."を抜く
  73. if(arraystr == ""){ arraySum = arraySum.substr(1); }
  74.  
  75. //データ挿入
  76. arraydata[arraySum] = xmldata.childNodes[i].childNodes[0].nodeValue;
  77.  
  78.  
  79. //Attributesの値を取得
  80. var Attributes:Object = xmldata.childNodes[i].attributes;
  81. for(var attribute_str:String in Attributes){
  82.  
  83. //属性がidの場合ユニークなAttributesの値で呼び出し
  84. if(attribute_str == unique && unique_on){
  85. //ダブり表示を消す
  86. arraystr_ext = xmldata.childNodes[i].nodeName;
  87. arraystr_ext += Attributes[attribute_str];
  88. //属性の値がダブるとき
  89. if(arraydata[arraystr + '.' + arraystr_ext] != undefined){
  90. var w = 2;
  91. while(arraydata[arraystr + '.' + arraystr_ext + '_' + w] != undefined){
  92. w++;
  93. }
  94. arraystr_ext += "_" + w;
  95. }
  96. arraySum = arraystr + "." + arraystr_ext;
  97. arraydata[arraySum] = xmldata.childNodes[i].childNodes[0].nodeValue;
  98. }
  99.  
  100. //属性の値書き出し
  101. arraydata[arraySum + "@" + attribute_str] = Attributes[attribute_str];
  102. //ガイド
  103. if(guide){
  104. trace(" Attributes "+ attribute_str +" の値 : " + Attributes[attribute_str] + newline
  105. + " xmlData['" + arraySum + "@" + attribute_str + "']" + newline);
  106. }
  107. }
  108.  
  109. //ショートカットパス設定
  110. scSum = shortcut + "." + (i + 1);
  111. if(shortcut == ""){scSum = scSum.substr(1);}
  112.  
  113. arraydata[scSum] = xmldata.childNodes[i].childNodes[0].nodeValue;
  114.  
  115. //同階層の要素の総数書き出し
  116. arraydata[arraySum + "->max"] = arraydata[scSum + "->max"] = xmldata.childNodes.length;
  117.  
  118. //同階層の頭から数えた順番書き出し
  119. arraydata[arraySum + "->num"] = arraydata[scSum + "->num"] = i + 1;
  120.  
  121. //ガイド
  122. if(guide){
  123. trace(i + 1 + "/" + xmldata.childNodes.length + " " + xmldata.childNodes[i].nodeName + " の内容 : " + xmldata.childNodes[i].childNodes[0].nodeValue
  124. + newline + "xmlData['" + arraySum + "']" + newline + "or : " + "xmlData['" + scSum + "']" + newline);
  125. }
  126.  
  127. // ---- 一階層下に
  128. if(xmldata.childNodes[i].childNodes[0].firstChild != null){
  129. procParseDataXML(xmldata.childNodes[i], arraydata, arraySum, scSum);
  130. }
  131. }
  132. }

Report this snippet  

You need to login to post a comment.