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