Patch #103885: Add dynamic registration and lookup of DOM implementations.
This commit is contained in:
parent
f5d3ea00b9
commit
7edbd4ffb4
@ -85,6 +85,36 @@ the strict mapping from IDL). See section \ref{dom-conformance},
|
|||||||
{This specifies the mapping from OMG IDL to Python.}
|
{This specifies the mapping from OMG IDL to Python.}
|
||||||
\end{seealso}
|
\end{seealso}
|
||||||
|
|
||||||
|
\subsection{Module Contents}
|
||||||
|
|
||||||
|
The \module{xml.dom} contains the following functions:
|
||||||
|
|
||||||
|
\begin{funcdesc}{registerDOMImplementation}{name, factory}
|
||||||
|
Register the \var{factory} function with the \var{name}. The factory
|
||||||
|
function should return an object which implements the
|
||||||
|
\code{DOMImplementation| interface. The factory function can either return
|
||||||
|
the same object, or a new one (e.g. if that implementation supports
|
||||||
|
some customization).
|
||||||
|
\end{funcdesc}
|
||||||
|
|
||||||
|
\begin{funcdesc}{getDOMImplementation}{name = None, features = ()}
|
||||||
|
Return a suitable DOM implementation. The \var{name} is either
|
||||||
|
well-known, the module name of a DOM implementation, or
|
||||||
|
\code{None}. If it is not \code{None}, imports the corresponding module and
|
||||||
|
returns a \class{DOMImplementation} object if the import succeeds. If
|
||||||
|
no name is given, and if the environment variable \code{PYTHON_DOM} is
|
||||||
|
set, this variable is used to find the implementation.
|
||||||
|
|
||||||
|
If name is not given, consider the available implementations to find
|
||||||
|
one with the required feature set. If no implementation can be found,
|
||||||
|
raise an \exception{ImportError}. The features list must be a sequence of
|
||||||
|
(feature, version) pairs which are passed to hasFeature.
|
||||||
|
\end{funcdesc}
|
||||||
|
|
||||||
|
% Should the Node documentation go here?
|
||||||
|
|
||||||
|
In addition, \module{xml.dom} contains the \class{Node}, and the DOM
|
||||||
|
exceptions.
|
||||||
|
|
||||||
\subsection{Objects in the DOM \label{dom-objects}}
|
\subsection{Objects in the DOM \label{dom-objects}}
|
||||||
|
|
||||||
|
@ -115,3 +115,5 @@ class NamespaceErr(DOMException):
|
|||||||
|
|
||||||
class InvalidAccessErr(DOMException):
|
class InvalidAccessErr(DOMException):
|
||||||
code = INVALID_ACCESS_ERR
|
code = INVALID_ACCESS_ERR
|
||||||
|
|
||||||
|
from domreg import getDOMImplementation,registerDOMImplementation
|
||||||
|
76
Lib/xml/dom/domreg.py
Normal file
76
Lib/xml/dom/domreg.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
"""Registration facilities for DOM. This module should not be used
|
||||||
|
directly. Instead, the functions getDOMImplementation and
|
||||||
|
registerDOMImplementation should be imported from xml.dom."""
|
||||||
|
|
||||||
|
# This is a list of well-known implementations. Well-known names
|
||||||
|
# should be published by posting to xml-sig@python.org, and are
|
||||||
|
# subsequently recorded in this file.
|
||||||
|
|
||||||
|
well_known_implementations = {
|
||||||
|
'minidom':'xml.dom.minidom',
|
||||||
|
'4DOM': 'xml.dom.DOMImplementation',
|
||||||
|
}
|
||||||
|
|
||||||
|
# DOM implementations not officially registered should register
|
||||||
|
# themselves with their
|
||||||
|
|
||||||
|
registered = {}
|
||||||
|
|
||||||
|
def registerDOMImplementation(name, factory):
|
||||||
|
"""registerDOMImplementation(name, factory)
|
||||||
|
|
||||||
|
Register the factory function with the name. The factory function
|
||||||
|
should return an object which implements the DOMImplementation
|
||||||
|
interface. The factory function can either return the same object,
|
||||||
|
or a new one (e.g. if that implementation supports some
|
||||||
|
customization)."""
|
||||||
|
|
||||||
|
registered[name] = factory
|
||||||
|
|
||||||
|
def _good_enough(dom, features):
|
||||||
|
"_good_enough(dom, features) -> Return 1 if the dom offers the features"
|
||||||
|
for f,v in features:
|
||||||
|
if not dom.hasFeature(f,v):
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
|
|
||||||
|
def getDOMImplementation(name = None, features = ()):
|
||||||
|
"""getDOMImplementation(name = None, features = ()) -> DOM implementation.
|
||||||
|
|
||||||
|
Return a suitable DOM implementation. The name is either
|
||||||
|
well-known, the module name of a DOM implementation, or None. If
|
||||||
|
it is not None, imports the corresponding module and returns
|
||||||
|
DOMImplementation object if the import succeeds.
|
||||||
|
|
||||||
|
If name is not given, consider the available implementations to
|
||||||
|
find one with the required feature set. If no implementation can
|
||||||
|
be found, raise an ImportError. The features list must be a sequence
|
||||||
|
of (feature, version) pairs which are passed to hasFeature."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
creator = None
|
||||||
|
mod = well_known_implementations.get(name)
|
||||||
|
if mod:
|
||||||
|
mod = __import__(mod, {}, {}, ['getDOMImplementation'])
|
||||||
|
return mod.getDOMImplementation()
|
||||||
|
elif name:
|
||||||
|
return registered[name]()
|
||||||
|
elif os.environ.has_key("PYTHON_DOM"):
|
||||||
|
return getDOMImplementation(name = os.environ["PYTHON_DOM"])
|
||||||
|
|
||||||
|
# User did not specify a name, try implementations in arbitrary
|
||||||
|
# order, returning the one that has the required features
|
||||||
|
for creator in registered.values():
|
||||||
|
dom = creator()
|
||||||
|
if _good_enough(dom, features):
|
||||||
|
return dom
|
||||||
|
|
||||||
|
for creator in well_known_implementations.keys():
|
||||||
|
try:
|
||||||
|
dom = getDOMImplementation(name = creator)
|
||||||
|
except StandardError: # typically ImportError, or AttributeError
|
||||||
|
continue
|
||||||
|
if _good_enough(dom, features):
|
||||||
|
return dom
|
||||||
|
|
||||||
|
raise ImportError,"no suitable DOM implementation found"
|
@ -782,3 +782,6 @@ def parseString(*args, **kwargs):
|
|||||||
"""Parse a file into a DOM from a string."""
|
"""Parse a file into a DOM from a string."""
|
||||||
from xml.dom import pulldom
|
from xml.dom import pulldom
|
||||||
return _doparse(pulldom.parseString, args, kwargs)
|
return _doparse(pulldom.parseString, args, kwargs)
|
||||||
|
|
||||||
|
def getDOMImplementation():
|
||||||
|
return Document.implementation
|
||||||
|
Loading…
x
Reference in New Issue
Block a user