original_string: protected function traverse($node, &$toTraverse, &$props, $root) {
      foreach ($toTraverse as $i => $elem)  {
        if ($elem->isSameNode($node)){
          unset($toTraverse[$i]);
        }
      }
      if (!$root->isSameNode($node)) {
        $names = $node->itemProp();
        if (count($names)) {
          //@todo Add support for property name filtering.
          $props[] = $node;
        }
        if ($node->itemScope()) {
          return;
        }
      }
      if (isset($node)) {
        // An xpath expression is used to get children instead of childNodes
        // because childNodes contains DOMText children as well, which breaks on
        // the call to getAttributes() in itemProp().
        $children = $this->ownerDocument->xpath()->query($node->getNodePath() . '/*');
        foreach ($children as $child) {
          $this->traverse($child, $toTraverse, $props, $root);
        }
      }
    }
code: protected function traverse($node, &$toTraverse, &$props, $root) {
      foreach ($toTraverse as $i => $elem)  {
        if ($elem->isSameNode($node)){
          unset($toTraverse[$i]);
        }
      }
      if (!$root->isSameNode($node)) {
        $names = $node->itemProp();
        if (count($names)) {
          //@todo Add support for property name filtering.
          $props[] = $node;
        }
        if ($node->itemScope()) {
          return;
        }
      }
      if (isset($node)) {
        // An xpath expression is used to get children instead of childNodes
        // because childNodes contains DOMText children as well, which breaks on
        // the call to getAttributes() in itemProp().
        $children = $this->ownerDocument->xpath()->query($node->getNodePath() . '/*');
        foreach ($children as $child) {
          $this->traverse($child, $toTraverse, $props, $root);
        }
      }
    }
code_tokens: protected function traverse ( $ node , & $ toTraverse , & $ props , $ root ) { foreach ( $ toTraverse as $ i => $ elem ) { if ( $ elem -> isSameNode ( $ node ) ) { unset ( $ toTraverse [ $ i ] ) ; } } if ( ! $ root -> isSameNode ( $ node ) ) { $ names = $ node -> itemProp ( ) ; if ( count ( $ names ) ) { //@todo Add support for property name filtering. $ props [ ] = $ node ; } if ( $ node -> itemScope ( ) ) { return ; } } if ( isset ( $ node ) ) { // An xpath expression is used to get children instead of childNodes // because childNodes contains DOMText children as well, which breaks on // the call to getAttributes() in itemProp(). $ children = $ this -> ownerDocument -> xpath ( ) -> query ( $ node -> getNodePath ( ) . '/*' ) ; foreach ( $ children as $ child ) { $ this -> traverse ( $ child , $ toTraverse , $ props , $ root ) ; } } }
docstring: Traverse the tree.
  
  In MicrodataJS, this is handled using a closure.
  See comment for MicrodataPhp:getObject() for an explanation of closure use
  in this library.
docstring_tokens: Traverse the tree .