1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
########################################################################
#
# File Name: NodeIterator.py
#
#
"""
Node Iterators from DOM Level 2. Allows "flat" iteration over nodes.
WWW: http://4suite.com/4DOM e-mail: support@4suite.com
Copyright (c) 2000 Fourthought Inc, USA. All Rights Reserved.
See http://4suite.com/COPYRIGHT for license and copyright information
"""
from NodeFilter import NodeFilter
from xml.dom import NoModificationAllowedErr
from xml.dom import InvalidStateErr
class NodeIterator:
def __init__(self, root, whatToShow, filter, expandEntityReferences):
self.__dict__['root'] = root
self.__dict__['filter'] = filter
self.__dict__['expandEntityReferences'] = expandEntityReferences
self.__dict__['whatToShow'] = whatToShow
self.__dict__['_atStart'] = 1
self.__dict__['_atEnd'] = 0
self.__dict__['_current'] = root
self.__dict__['_nodeStack'] = []
self.__dict__['_detached'] = 0
def __setattr__(self, name, value):
if name in ['root', 'filter', 'expandEntityReferences', 'whatToShow']:
raise NoModificationAllowedErr()
self.__dict__[name] = value
def _get_root(self):
return self.root
def _get_filter(self):
return self.filter
def _get_expandEntityReferences(self):
return self.expandEntityReferences
def _get_whatToShow(self):
return self.whatToShow
def nextNode(self):
if self._detached:
raise InvalidStateErr()
next_node = self._advance()
while (next_node and not (
self._checkWhatToShow(next_node) and
self._checkFilter(next_node) == NodeFilter.FILTER_ACCEPT)):
next_node = self._advance()
return next_node
def previousNode(self):
if self._detached:
raise InvalidStateErr()
prev_node = self._regress()
while (prev_node and not (
self._checkWhatToShow(prev_node) and
self._checkFilter(prev_node) == NodeFilter.FILTER_ACCEPT)):
prev_node = self._regress()
return prev_node
def detach(self):
self._detached = 1
def _advance(self):
node = None
if self._atStart:
# First time through
self._atStart = 0
node = self._current
elif not self._atEnd:
current = self._current
if current.firstChild:
# Do children first
node = current.firstChild
else:
# Now try the siblings
while current is not self.root:
if current.nextSibling:
node = current.nextSibling
break
# We are at the end of a branch, starting going back up
current = current.parentNode
else:
node = None
if node:
self._current = node
else:
self._atEnd = 1
return node
def _regress(self):
node = None
if self._atEnd:
self._atEnd = 0
node = self._current
elif not self._atStart:
current = self._current
if current is self.root:
node = None
elif current.previousSibling:
node = current.previousSibling
if node.lastChild:
node = node.lastChild
else:
node = current.parentNode
if node:
self._current = node
else:
self._atStart = 1
return node
def _checkWhatToShow(self, node):
show_bit = 1 << (node.nodeType - 1)
return self.whatToShow & show_bit
def _checkFilter(self, node):
if self.filter:
return self.filter.acceptNode(node)
else:
return NodeFilter.FILTER_ACCEPT
|