トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

XML構造をたどる_Flash

XML構造をたどる

「test.xml」というのを読み込み、内容が以下とします。読み込み方法は、「XMLファイルから情報を読み取る」を参照してください。

<?xml version="1.0" encoding="UTF-8" ?>
<zaiko>
  <zaiko-data num="1">
    <name>みかん</name>
    <unit>0</unit>
    <data>
       <date>2003/04/01</date>
       <date2>2003/04/02</date2>
    </data>
  </zaiko-data>
  <zaiko-data num="2">
    <name>りんご</name>
    <unit>1</unit>
    <data>
      <date>2003/03/12</date>
      <date2>2003/04/03</date2>
    </data>
  </zaiko-data>
</zaiko>

ここでは、

xmlCtrl = new XML();
xmlCtrl.onLoad = xmlProc;

xmlCtrl.load("test.xml");

function xmlProc(success) {
  if(!success) return;
}

のようにして、関数「xmlProc」にてXMLファイルをたどる、とします。

ルートノードを検索

ルートノードである<zaiko>を手繰り寄せます。この処理は、XMLのノードを先頭から調べていき、ノードタイプが要素となるものをルートとします。

var node = xmlCtrl.firstChild;

while(node != null) {
  if(node.nodeType == 1) break;
    node = node.nextSibling;
}

このときのnodeがルートノード(要素)になります。XMLの各ノードは「XMLNode」オブジェクトになります。

「xmlCtrl.firstChild」にて、はじめの子ノードを取得してきます。XMLファイルの先頭は「<?xml version="1.0" encoding="UTF-8" ?>」というヘッダ文字列ですのでこれをスキップしていく必要があります。「node.nodeType」にてノードの種類を取得します。種類としては以下のものがあります。

nodeTypeの値種類
1要素(エレメント)
3テキストノード

このnodeTypeが1であるとwhileから抜けるようにしている、ということは要素まで順番に探している、となります。「node.nextSibling」は、nodeの子である次の子ノードを取得します。

使用する場合は関数化して、以下のようにまとめてしまったほうが見やすいかもしれません。

// ルートノードを取り出す関数
function getRootNode(xmlObject) {
  var node = xmlObject.firstChild;

  while(node != null) {
    if(node.nodeType == 1) break;
      node = node.nextSibling;
  }
  return node;
}
// ルートノードを取り出す
var rootNode;
rootNode = getRootNode(xmlCtrl);

これはもっとも単純な例ですが、このようにノードをたどりながらXMLファイルの指定の要素および値・属性などを手繰り寄せていきます。

次は、ルートノードである<zaiko>から、子の<zaiko-data>要素を取得してみます。

子ノードを検索

ノードをたどるには、ルートノード(XMLNode)から子ノードがあるか調べて、その中でノードの種類を見ていきます。と、いきなり検索関数を記述してその中身を見ていくことにします。

//-------------------------------------------------//
// 指定のノードより、指定名の要素ノードを取得      //
// srcNode       ... 元の親ノード                  //
// searchElement ... 検索する要素名                //
//-------------------------------------------------//
function findNode(srcNode, searchElement) {
  var childs;
  var childCou;
  var loop;
  var cNode, nNode;
  var type;

  // 子ノードの配列を取得
  childs   = null;
  childCou = 0;
  if(srcNode.hasChildNodes()) {
    childs   = srcNode.childNodes
    childCou = childs.length;
  }
		
  cNode = null;
  for(loop = 0; loop < childCou; loop++) {
    cNode = childs[loop];
    type  = cNode.nodeType;
    if(type == 1) {   // エレメントの場合
      if(cNode.nodeName == searchElement) {
        break;
      }
    }
  }
  if(loop >= childCou) return null;
  return cNode;
}

まだ途中...

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.