diff options
| author | Stefan Behnel <stefan_ml@behnel.de> | 2012-04-24 16:00:24 +0200 |
|---|---|---|
| committer | Stefan Behnel <stefan_ml@behnel.de> | 2012-04-24 16:00:24 +0200 |
| commit | 2260f8d0dd4feb14b67ab90616320ffdd79f3a7e (patch) | |
| tree | 88263deff4e54950b9d0d296f7a1b553f1df0716 /src | |
| parent | ba07885d1142b80d23539d201d819e677f712081 (diff) | |
| download | python-lxml-2260f8d0dd4feb14b67ab90616320ffdd79f3a7e.tar.gz | |
use _MultiTagMatcher in iterwalk()
Diffstat (limited to 'src')
| -rw-r--r-- | src/lxml/iterparse.pxi | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/src/lxml/iterparse.pxi b/src/lxml/iterparse.pxi index f05cc72f..396a6b97 100644 --- a/src/lxml/iterparse.pxi +++ b/src/lxml/iterparse.pxi @@ -546,49 +546,33 @@ cdef class iterwalk: A tree walker that generates events from an existing tree as if it was parsing XML data with ``iterparse()``. """ + cdef _MultiTagMatcher _matcher cdef list _node_stack cdef int _index cdef list _events cdef object _pop_event cdef int _event_filter - cdef tuple _tag_tuple - cdef char* _tag_href - cdef char* _tag_name def __init__(self, element_or_tree, events=(u"end",), tag=None): cdef _Element root cdef int ns_count root = _rootNodeOrRaise(element_or_tree) self._event_filter = _buildIterparseEventFilter(events) - self._setTagFilter(tag) + if tag is None or tag == '*': + self._matcher = None + else: + self._matcher = _MultiTagMatcher(tag) self._node_stack = [] self._events = [] self._pop_event = self._events.pop - if self._event_filter != 0: + if self._event_filter: self._index = 0 ns_count = self._start_node(root) self._node_stack.append( (root, ns_count) ) else: self._index = -1 - cdef void _setTagFilter(self, tag): - if tag is None or tag == u'*': - self._tag_href = NULL - self._tag_name = NULL - else: - href, name = self._tag_tuple = _getNsTag(tag) - if href is None or href == b'*': - self._tag_href = NULL - else: - self._tag_href = _cstr(href) - if name is None or name == b'*': - self._tag_name = NULL - else: - self._tag_name = _cstr(name) - if self._tag_href is NULL and self._tag_name is NULL: - self._tag_tuple = None - def __iter__(self): return self @@ -596,10 +580,13 @@ cdef class iterwalk: cdef xmlNode* c_child cdef _Element node cdef _Element next_node - cdef int ns_count + cdef int ns_count = 0 if self._events: return self._pop_event(0) - ns_count = 0 + if self._matcher is not None and self._index >= 0: + node = self._node_stack[self._index][0] + self._matcher.cacheTags(node._doc) + # find next node while self._index >= 0: node = self._node_stack[self._index][0] @@ -639,8 +626,7 @@ cdef class iterwalk: else: ns_count = 0 if self._event_filter & ITERPARSE_FILTER_START: - if self._tag_tuple is None or \ - _tagMatches(node._c_node, self._tag_href, self._tag_name): + if self._matcher is None or self._matcher.matches(node._c_node): self._events.append( (u"start", node) ) return ns_count @@ -649,8 +635,7 @@ cdef class iterwalk: cdef int i, ns_count node, ns_count = self._node_stack.pop() if self._event_filter & ITERPARSE_FILTER_END: - if self._tag_tuple is None or \ - _tagMatches(node._c_node, self._tag_href, self._tag_name): + if self._matcher is None or self._matcher.matches(node._c_node): self._events.append( (u"end", node) ) if self._event_filter & ITERPARSE_FILTER_END_NS: event = (u"end-ns", None) |
