📄 dom2_traversalimpl.cpp
字号:
Node TreeWalkerImpl::getRoot(){ // ### return 0;}unsigned long TreeWalkerImpl::getWhatToShow(){ // ### return 0;}NodeFilter TreeWalkerImpl::getFilter(){ // ### return 0;}bool TreeWalkerImpl::getExpandEntityReferences(){ // ### return 0;}Node TreeWalkerImpl::getCurrentNode(){ return currentNode;}void TreeWalkerImpl::setWhatToShow(long _whatToShow){ // do some testing wether this is an accepted value whatToShow = _whatToShow;}void TreeWalkerImpl::setFilter(NodeFilter *_filter){ if(_filter) filter = _filter;}void TreeWalkerImpl::setExpandEntityReferences(bool value){ expandEntityReferences = value;}void TreeWalkerImpl::setCurrentNode( const Node n ){ if( !n.isNull() ) { rootNode = n; currentNode = n; }// else// throw( DOMException::NOT_SUPPORTED_ERR );}Node TreeWalkerImpl::parentNode( ){ Node n = getParentNode(currentNode); if( !n.isNull() ) currentNode = n; return n;}Node TreeWalkerImpl::firstChild( ){ Node n = getFirstChild(currentNode); if( !n.isNull() ) currentNode = n; return n;}Node TreeWalkerImpl::lastChild( ){ Node n = getLastChild(currentNode); if( !n.isNull() ) currentNode = n; return n;}Node TreeWalkerImpl::previousSibling( ){ Node n = getPreviousSibling(currentNode); if( !n.isNull() ) currentNode = n; return n;}Node TreeWalkerImpl::nextSibling( ){ Node n = getNextSibling(currentNode); if( !n.isNull() ) currentNode = n; return n;}Node TreeWalkerImpl::previousNode( ){/* 1. my previous sibling.lastchild * 2. my previous sibling * 3. my parent */ Node n = getPreviousSibling(currentNode); if( n.isNull() ) { n = getParentNode(currentNode); if( !n.isNull() ) //parent { currentNode = n; return currentNode; } else // parent failed.. no previous node return Node(); } Node child = getLastChild(n); if( !child.isNull() ) // previous siblings last child { currentNode = child; return currentNode; } else // previous sibling { currentNode = n; return currentNode; } return Node(); // should never get here!}Node TreeWalkerImpl::nextNode( ){/* 1. my first child * 2. my next sibling * 3. my parents sibling, or their parents sibling (loop) * 4. not found */ Node n = getFirstChild(currentNode); if( !n.isNull() ) // my first child { currentNode = n; return n; } n = getNextSibling(currentNode); // my next sibling if( !n.isNull() ) { currentNode = n; return currentNode; } Node parent = getParentNode(currentNode); while( !parent.isNull() ) // parents sibling { n = getNextSibling(parent); if( !n.isNull() ) { currentNode = n; return currentNode; } else parent = getParentNode(parent); } return Node();}short TreeWalkerImpl::isAccepted(Node n){ // if XML is implemented we have to check expandEntityRerefences in this function if( ( ( 1 << n.nodeType()-1 ) & whatToShow) != 0 ) { if(filter) return filter->acceptNode(n); else return NodeFilter::FILTER_ACCEPT; } return NodeFilter::FILTER_SKIP;}Node TreeWalkerImpl::getParentNode(Node n){ short _result = NodeFilter::FILTER_ACCEPT; if( n == rootNode /*|| n.isNull()*/ ) return Node(); Node _tempCurrent = n.parentNode(); if( _tempCurrent.isNull() ) return Node(); _result = isAccepted(_tempCurrent ); if(_result == NodeFilter::FILTER_ACCEPT) return _tempCurrent; // match found return getParentNode(_tempCurrent);}Node TreeWalkerImpl::getFirstChild(Node n){ short _result; if( n.isNull() || n.firstChild().isNull() ) return Node(); n = n.firstChild(); _result = isAccepted(n); switch(_result) { case NodeFilter::FILTER_ACCEPT: return n; break; case NodeFilter::FILTER_SKIP: if( n.hasChildNodes() ) return getFirstChild(n); else return getNextSibling(n); break; case NodeFilter::FILTER_REJECT: return getNextSibling(n); break; } return Node(); // should never get here!}Node TreeWalkerImpl::getLastChild(Node n){ short _result; if( n.isNull() || n.lastChild().isNull() ) return Node(); n = n.lastChild(); _result = isAccepted(n); switch(_result) { case NodeFilter::FILTER_ACCEPT: return n; break; case NodeFilter::FILTER_SKIP: if( n.hasChildNodes() ) return getLastChild(n); else return getPreviousSibling(n); break; case NodeFilter::FILTER_REJECT: return getPreviousSibling(n); break; } return Node();}Node TreeWalkerImpl::getPreviousSibling(Node n){ short _result; Node _tempCurrent; if( n.isNull() ) return Node(); //first the cases if we have a previousSibling _tempCurrent = n.previousSibling(); if( !_tempCurrent.isNull() ) { _result = isAccepted(_tempCurrent); switch(_result) { case NodeFilter::FILTER_ACCEPT: return _tempCurrent; break; case NodeFilter::FILTER_SKIP: { Node nskip = getLastChild(_tempCurrent); if( !nskip.isNull() ) return nskip; return getPreviousSibling(_tempCurrent); break; } case NodeFilter::FILTER_REJECT: return getPreviousSibling(_tempCurrent); break; } } // now the case if we don't have previous sibling else { _tempCurrent = _tempCurrent.parentNode(); if(_tempCurrent.isNull() || _tempCurrent == rootNode) return Node(); _result = isAccepted(_tempCurrent); if(_result == NodeFilter::FILTER_SKIP) return getPreviousSibling(_tempCurrent); return Node(); } return Node(); // should never get here!}Node TreeWalkerImpl::getNextSibling(Node n){ Node _tempCurrent; short _result; if( n.isNull() || _tempCurrent == rootNode) return Node(); _tempCurrent = n.nextSibling(); if( !_tempCurrent.isNull() ) { _result = isAccepted(_tempCurrent); switch(_result) { case NodeFilter::FILTER_ACCEPT: return _tempCurrent; break; case NodeFilter::FILTER_SKIP: { Node nskip = getFirstChild(_tempCurrent); if( !nskip.isNull() ) return nskip; return getNextSibling(_tempCurrent); break; } case NodeFilter::FILTER_REJECT: return getNextSibling(_tempCurrent); break; } } else { _tempCurrent = _tempCurrent.parentNode(); if(_tempCurrent.isNull() || _tempCurrent == rootNode) return Node(); _result = isAccepted(_tempCurrent); if(_result == NodeFilter::FILTER_SKIP) return getNextSibling(_tempCurrent); return Node(); } return Node();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -