* 紹介 [1] [DFN@en[[CODE(DOMi)@en[[[SerialWalker]]]]]] は、 [[manakai]] 独自の [[DOM]] [[界面]]です。 [[DOM]] [[木]]を[[文書順]]にたどることができますが、 [[子節点]]を訪問した後、もう一度[[親節点]]を訪問してから次の[[子節点]]へ向かいます。 @@ もっとよい[[界面]]名があればと思っていますが。。。 [2] 例えば、 [PRE(aafig)[ [VAR@en[A]] / | \ [VAR@en[B]] [VAR@en[C]] [VAR@en[D]] / \ [VAR@en[E]] [VAR@en[F]] ]PRE] という[[木]]では、 ,[CODE(DOMa)@en[[[currentNode]]]],[CODE(DOMa)@en[[[currentPhase]]]],[CODE(DOMa)@en[[[currentIndex]]]] ,[VAR@en[A]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[B]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[B]],[CODE(DOMc)@en[[[POST_PHASE]]]],1 ,[VAR@en[A]],[CODE(DOMc)@en[[[IN_PHASE]]]],1 ,[VAR@en[C]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[C]],[CODE(DOMc)@en[[[POST_PHASE]]]],1 ,[VAR@en[A]],[CODE(DOMc)@en[[[IN_PHASE]]]],2 ,[VAR@en[D]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[E]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[E]],[CODE(DOMc)@en[[[POST_PHASE]]]],1 ,[VAR@en[D]],[CODE(DOMc)@en[[[IN_PHASE]]]],1 ,[VAR@en[F]],[CODE(DOMc)@en[[[PRE_PHASE]]]],0 ,[VAR@en[F]],[CODE(DOMc)@en[[[POST_PHASE]]]],1 ,[VAR@en[D]],[CODE(DOMc)@en[[[POST_PHASE]]]],2 ,[VAR@en[A]],[CODE(DOMc)@en[[[POST_PHASE]]]],3 の順に訪問します。 [3] [[節点]]と[[節点]]の間や[[子節点]]の後で作業が必要な時に便利です。 例えば、[[SAX]] の[[事象]]列を生成したり、 [[DOM]] [[木]]を [[SXML]] に[[直列化]]したりするのに使うことができます。 * 使い方 [4] '''作成''': [CODE(DOMi)@en[[[TreeWalker]]]] と同じように、 [CODE(DOMi)@en[[[DocumentTraversal]]]] [[界面]]の[[メソッド]] [CODE(DOMm)@en[[[manakaiCreateSerialWalker]]]] から作成します。 [[引数]]も [CODE(DOMm)@en[[[createTreeWalker]]]] と同じです。 [PRE(DOM perl example code)[ [CODE(keyword)@en[my]] [VAR@en[$doctrv]] = [VAR@en[$doc]]->[CODE(DOMm)@en[get_feature]] ('Traversal'); [CODE(keyword)@en[my]] [VAR@en[$sw]] = [VAR@en[$doctrv]]->[CODE(DOMm)@en[manakai_create_serial_walker]] ([VAR@en[$root_node]], [VAR@en[$what_to_show]], [VAR@en[$filter]], [VAR@en[$expand_entity_references]]); ]PRE] [5] '''探索''': [CODE(DOMi)@en[[[SerialWalker]]]] の唯一の[[探索]][[メソッド]]は [CODE(DOMm)@en[[[nextNode]]]] です。 次の[[節点]]があれば、それを返します。なければ、 [CODE(DOM)@en[[[null]]]] を返します。 [CODE(DOMi)@en[[[TreeWalker]]]] の[[探索]][[メソッド]]と同じように、 この[[メソッド]]が [CODE(DOM)@en[[[null]]]] でない値を返した時は [CODE(DOMa)@en[[[currentNode]]]], [CODE(DOMa)@en[[[currentPhase]]]], [CODE(DOMa)@en[[[currentIndex]]]] が更新されます。 [PRE(DOM perl example code)[ [SPAN(comemnt)@en[## 節点名、フェーズ、索引番号を順に出力する]] [CODE(keyword)@en[while]] ([CODE(keyword)@en[defined]] [VAR@en[$sw]]->[CODE(DOMm)@en[next_node]]) { [CODE(keyword)@en[print]] [VAR@en[$sw]]->[CODE(DOMa)@en[current_node]]->[CODE(DOMa)@en[node_name]], "\t", [VAR@en[$sw]]->[CODE(DOMa)@en[current_phase]], "\t", [VAR@en[$sw]]->[CODE(DOMa)@en[current_index]], "\n"; } ]PRE] [6] '''属性''': :[CODE(DOMa)@en[[[root]]]]:[CODE(DOMi)@en[[[SerialWalker]]]] を作成する時に指定した[[根節点]]です。 [CODE(DOMi)@en[[[SerialWalker]]]] はこの[[節点]]を[[根]]とする[[部分木]]を歩き回ります。 :[CODE(DOMa)@en[[[expandEntityReference]]]]:[CODE(DOMi)@en[[[SerialWalker]]]] を作成する時に指定した、[[実体参照]]の見せ方の指定です。 取り得る値と意味は [CODE(DOMi)@en[[[TreeWalker]]]] のものと同じです。 :[CODE(DOMa)@en[[[whatToShow]]]]:[CODE(DOMi)@en[[[SerialWalker]]]] を作成する時に指定した、見せる[[節点]]の種類です。 取り得る値と意味は [CODE(DOMi)@en[[[TreeWalker]]]] のものと同じです。 :[CODE(DOMa)@en[[[filter]]]]:[CODE(DOMi)@en[[[SerialWalker]]]] を作成する時に指定した [CODE(DOMi)@en[[[NodeFilter]]]] です。 取り得る値と意味は [CODE(DOMi)@en[[[TreeWalker]]]] のものと同じです。 :[CODE(DOMa)@en[[[currentNode]]]]:最後に [CODE(DOMm)@en[[[nextNode]]]] が返した[[節点]]です。 [CODE(DOMi)@en[[[TreeWalker]]]] とは異なり、 この[[属性]]は読取専用です。 :[CODE(DOMa)@en[[[currentPhase]]]]:[CODE(DOMa)@en[[[currentPhase]]]] のフェーズ番号です。 [CODE(DOMc)@en[[[PRE_PHASE]]]] は、その[[節点]]に初めて訪問したことを示します。 [[子節点]]があれば、次にそれが訪問されます。 [CODE(DOMc)@en[[[IN_PHASE]]]] は、その[[節点]]のある[[子節点]]を訪問し、 その次の[[子節点]]を訪問する前に一旦[[親節点]]を訪問していることを示します。 [CODE(DOMc)@en[[[POST_PHASE]]]] は、その[[節点]]の[[子節点]]があればすべて訪問し終え、その[[節点]]に戻ってきたことを示します。 [[子節点]]がない (または見えない) [[節点]]では、 [CODE(DOMc)@en[[[PRE_PHASE]]]] の後すぐに [CODE(DOMc)@en[[[POST_PHASE]]]] で同じ[[節点]]を訪問します。 :[CODE(DOMa)@en[[[currentIndex]]]]:前にその[[節点]]を訪問した回数を示します。 [CODE(DOMa)@en[[[currentPhase]]]] が [CODE(DOMc)@en[[[PRE_PHASE]]]] なら、[CODE(DOMa)@en[[[currentIndex]]]] は零です。 その後同じ[[節点]]に訪問する度に、値が1ずつ増えていきます。 * メモ