You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

139 lines
5.4 KiB

#
# genxmlif, Release 0.9.0
# file: xmlif4Dom.py
#
# XML interface class to the 4DOM library
#
# history:
# 2005-04-25 rl created
# 2008-07-01 rl Limited support of XInclude added
#
# Copyright (c) 2005-2008 by Roland Leuthe. All rights reserved.
#
# --------------------------------------------------------------------
# The generix XML interface is
#
# Copyright (c) 2005-2008 by Roland Leuthe
#
# By obtaining, using, and/or copying this software and/or its
# associated documentation, you agree that you have read, understood,
# and will comply with the following terms and conditions:
#
# Permission to use, copy, modify, and distribute this software and
# its associated documentation for any purpose and without fee is
# hereby granted, provided that the above copyright notice appears in
# all copies, and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of
# the author not be used in advertising or publicity
# pertaining to distribution of the software without specific, written
# prior permission.
#
# THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
# ABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
# --------------------------------------------------------------------
import urllib
from xml.dom.ext.reader.Sax2 import Reader, XmlDomGenerator
from xml.sax._exceptions import SAXParseException
from ..genxmlif import XMLIF_4DOM, GenXmlIfError
from xmlifUtils import convertToAbsUrl
from xmlifDom import XmlInterfaceDom, XmlIfBuilderExtensionDom, InternalDomTreeWrapper, InternalDomElementWrapper
class XmlInterface4Dom (XmlInterfaceDom):
#####################################################
# for description of the interface methods see xmlifbase.py
#####################################################
def __init__ (self, verbose, useCaching, processXInclude):
XmlInterfaceDom.__init__ (self, verbose, useCaching, processXInclude)
self.xmlIfType = XMLIF_4DOM
if self.verbose:
print "Using 4Dom interface module..."
def parse (self, file, baseUrl="", internalOwnerDoc=None):
absUrl = convertToAbsUrl (file, baseUrl)
fp = urllib.urlopen (absUrl)
return self._parseStream (fp, file, absUrl, internalOwnerDoc)
def parseString (self, text, baseUrl="", internalOwnerDoc=None):
import cStringIO
fp = cStringIO.StringIO(text)
absUrl = convertToAbsUrl ("", baseUrl)
return self._parseStream (fp, "", absUrl, internalOwnerDoc)
def _parseStream (self, fp, file, absUrl, internalOwnerDoc):
reader = Reader(validate=0, keepAllWs=0, catName=None,
saxHandlerClass=ExtXmlDomGenerator, parser=None)
reader.handler.extinit(file, absUrl, reader.parser, self)
if internalOwnerDoc != None:
ownerDoc = internalOwnerDoc.document
else:
ownerDoc = None
try:
tree = reader.fromStream(fp, ownerDoc)
fp.close()
except SAXParseException, errInst:
fp.close()
raise GenXmlIfError, "%s: SAXParseException: %s" %(file, str(errInst))
treeWrapper = reader.handler.treeWrapper
# XInclude support
if self.processXInclude:
if internalOwnerDoc == None:
internalOwnerDoc = treeWrapper.getTree()
self.xInclude (treeWrapper.getRootNode(), absUrl, internalOwnerDoc)
return treeWrapper
###################################################
# Extended DOM generator class derived from XmlDomGenerator
# extended to store related line numbers, file/URL names and
# defined namespaces in the node object
class ExtXmlDomGenerator(XmlDomGenerator, XmlIfBuilderExtensionDom):
def __init__(self, keepAllWs=0):
XmlDomGenerator.__init__(self, keepAllWs)
self.treeWrapper = None
def extinit (self, filePath, absUrl, parser, xmlIf):
self.filePath = filePath
self.absUrl = absUrl
self.parser = parser
self.xmlIf = xmlIf
def startElement(self, name, attribs):
XmlDomGenerator.startElement(self, name, attribs)
if not self.treeWrapper:
self.treeWrapper = self.xmlIf.treeWrapperClass(self, InternalDomTreeWrapper(self._rootNode), self.xmlIf.useCaching)
XmlIfBuilderExtensionDom.__init__(self, self.filePath, self.absUrl, self.treeWrapper, self.xmlIf.elementWrapperClass)
curNode = self._nodeStack[-1]
internal4DomElementWrapper = InternalDomElementWrapper(curNode, self.treeWrapper.getTree())
curNs = self._namespaces.items()
try:
curNs.remove( (None,None) )
except:
pass
XmlIfBuilderExtensionDom.startElementHandler (self, internal4DomElementWrapper, self.parser.getLineNumber(), curNs)
def endElement(self, name):
curNode = self._nodeStack[-1]
XmlIfBuilderExtensionDom.endElementHandler (self, curNode.xmlIfExtInternalWrapper, self.parser.getLineNumber())
XmlDomGenerator.endElement(self, name)