SerialWalker

SerialWalker

紹介

[1] SerialWalker は、 manakai 独自の DOM 界面です。 DOM 文書順にたどることができますが、 子節点を訪問した後、もう一度親節点を訪問してから次の子節点へ向かいます。

もっとよい界面名があればと思っていますが。。。

[2] 例えば、

    A
  / | \
 B  C  D
      / \
     E   F

というでは、

の順に訪問します。

currentNodecurrentPhasecurrentIndex
APRE_PHASE0
BPRE_PHASE0
BPOST_PHASE1
AIN_PHASE1
CPRE_PHASE0
CPOST_PHASE1
AIN_PHASE2
DPRE_PHASE0
EPRE_PHASE0
EPOST_PHASE1
DIN_PHASE1
FPRE_PHASE0
FPOST_PHASE1
DPOST_PHASE2
APOST_PHASE3

[3] 節点節点の間や子節点の後で作業が必要な時に便利です。 例えば、SAX事象列を生成したり、 DOM SXML直列化したりするのに使うことができます。

使い方

[4] 作成: TreeWalker と同じように、 DocumentTraversal 界面メソッド manakaiCreateSerialWalker から作成します。 引数createTreeWalker と同じです。

my $doctrv = $doc->get_feature ('Traversal');
my $sw = $doctrv->manakai_create_serial_walker
                    ($root_node,
                     $what_to_show,
                     $filter,
                     $expand_entity_references);

[5] 探索: SerialWalker の唯一の探索メソッドnextNode です。 次の節点があれば、それを返します。なければ、 null を返します。

TreeWalker探索メソッドと同じように、 このメソッドnull でない値を返した時は currentNode, currentPhase, currentIndex が更新されます。

## 節点名、フェーズ、索引番号を順に出力する
while (defined $sw->next_node) {
  print $sw->current_node->node_name, "\t",
        $sw->current_phase, "\t",
        $sw->current_index, "\n";
}

[6] 属性:

root
SerialWalker を作成する時に指定した根節点です。 SerialWalker はこの節点とする部分木を歩き回ります。
expandEntityReference
SerialWalker を作成する時に指定した、実体参照の見せ方の指定です。 取り得る値と意味は TreeWalker のものと同じです。
whatToShow
SerialWalker を作成する時に指定した、見せる節点の種類です。 取り得る値と意味は TreeWalker のものと同じです。
filter
SerialWalker を作成する時に指定した NodeFilter です。 取り得る値と意味は TreeWalker のものと同じです。
currentNode
最後に nextNode が返した節点です。 TreeWalker とは異なり、 この属性は読取専用です。
currentPhase
currentPhase のフェーズ番号です。 PRE_PHASE は、その節点に初めて訪問したことを示します。 子節点があれば、次にそれが訪問されます。 IN_PHASE は、その節点のある子節点を訪問し、 その次の子節点を訪問する前に一旦親節点を訪問していることを示します。 POST_PHASE は、その節点子節点があればすべて訪問し終え、その節点に戻ってきたことを示します。 子節点がない (または見えない) 節点では、 PRE_PHASE の後すぐに POST_PHASE で同じ節点を訪問します。
currentIndex
前にその節点を訪問した回数を示します。 currentPhasePRE_PHASE なら、currentIndex は零です。 その後同じ節点に訪問する度に、値が1ずつ増えていきます。

メモ