[pygccxml-commit] SF.net SVN: pygccxml: [1002] pygccxml_dev/pygccxml/parser
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-04-19 08:51:23
|
Revision: 1002 http://svn.sourceforge.net/pygccxml/?rev=1002&view=rev Author: roman_yakovenko Date: 2007-04-19 01:51:24 -0700 (Thu, 19 Apr 2007) Log Message: ----------- adding cElementTree parser - for big xml file the gain in speed could be more than 5% Modified Paths: -------------- pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/pygccxml/parser/source_reader.py Added Paths: ----------- pygccxml_dev/pygccxml/parser/etree_scanner.py Added: pygccxml_dev/pygccxml/parser/etree_scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/etree_scanner.py (rev 0) +++ pygccxml_dev/pygccxml/parser/etree_scanner.py 2007-04-19 08:51:24 UTC (rev 1002) @@ -0,0 +1,49 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import scanner +import xml.etree.cElementTree as ElementTree + +class etree_saxifier_t(object): + """Produces SAX events for an element and children.""" + def __init__(self, element_or_tree, content_handler): + try: + element = element_or_tree.getroot() + except AttributeError: + element = element_or_tree + self._element = element + self._content_handler = content_handler + + def saxify(self): + self._content_handler.startDocument() + self._recursive_saxify(self._element, {}) + self._content_handler.endDocument() + + def _recursive_saxify(self, element, prefixes): + attrs = {} + for attr in element.items(): + attrs[ attr[0] ] = attr[1] + + content_handler = self._content_handler + content_handler.startElement( element.tag, attrs ) + + if element.text: + content_handler.characters(element.text) + for child in element: + self._recursive_saxify(child, prefixes) + content_handler.endElement( element.tag ) + + if element.tail: + content_handler.characters(element.tail) + +class etree_scanner_t( scanner.scanner_t ): + def __init__(self, gccxml_file, decl_factory, *args ): + scanner.scanner_t.__init__( self, gccxml_file, decl_factory, *args ) + + def read( self ): + tree = ElementTree.parse( self.gccxml_file ) + saxifier = etree_saxifier_t( tree, self ) + saxifier.saxify() + Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-04-19 07:19:18 UTC (rev 1001) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-04-19 08:51:24 UTC (rev 1002) @@ -165,6 +165,12 @@ def members(self): return self.__members + def startElementNS(self, name, qname, attrs): + return self.startElement( name[1], attrs ) + + def endElementNS(self, name, qname): + return self.endElement( name[1] ) + def startElement(self, name, attrs): try: if name not in self.__readers: Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2007-04-19 07:19:18 UTC (rev 1001) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2007-04-19 08:51:24 UTC (rev 1002) @@ -8,7 +8,12 @@ import config import pygccxml.utils import linker -import scanner + +try: #select faster xml parser + from etree_scanner import etree_scanner_t as scanner_t +except: + from scanner import scanner_t + import declarations_cache import patcher from pygccxml.declarations import * @@ -308,7 +313,7 @@ return file_path def __parse_gccxml_created_file( self, gccxml_file ): - scanner_ = scanner.scanner_t( gccxml_file, self.__decl_factory ) + scanner_ = scanner_t( gccxml_file, self.__decl_factory ) scanner_.read() decls = scanner_.declarations() types = scanner_.types() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |