[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.
|