Import expatbuilder, minicompat from PyXML.
diff --git a/Lib/xml/dom/minicompat.py b/Lib/xml/dom/minicompat.py
new file mode 100644
index 0000000..9f2f8f7
--- /dev/null
+++ b/Lib/xml/dom/minicompat.py
@@ -0,0 +1,184 @@
+"""Python version compatibility support for minidom."""
+
+# This module should only be imported using "import *".
+#
+# The following names are defined:
+#
+#   isinstance    -- version of the isinstance() function that accepts
+#                    tuples as the second parameter regardless of the
+#                    Python version
+#
+#   NodeList      -- lightest possible NodeList implementation
+#
+#   EmptyNodeList -- lightest possible NodeList that is guarateed to
+#                    remain empty (immutable)
+#
+#   StringTypes   -- tuple of defined string types
+#
+#   GetattrMagic  -- base class used to make _get_<attr> be magically
+#                    invoked when available
+#   defproperty   -- function used in conjunction with GetattrMagic;
+#                    using these together is needed to make them work
+#                    as efficiently as possible in both Python 2.2+
+#                    and older versions.  For example:
+#
+#                        class MyClass(GetattrMagic):
+#                            def _get_myattr(self):
+#                                return something
+#
+#                        defproperty(MyClass, "myattr",
+#                                    "return some value")
+#
+#                    For Python 2.2 and newer, this will construct a
+#                    property object on the class, which avoids
+#                    needing to override __getattr__().  It will only
+#                    work for read-only attributes.
+#
+#                    For older versions of Python, inheriting from
+#                    GetattrMagic will use the traditional
+#                    __getattr__() hackery to achieve the same effect,
+#                    but less efficiently.
+#
+#                    defproperty() should be used for each version of
+#                    the relevant _get_<property>() function.
+#
+#   NewStyle      -- base class to cause __slots__ to be honored in
+#                    the new world
+#
+#   True, False   -- only for Python 2.2 and earlier
+
+__all__ = ["NodeList", "EmptyNodeList", "NewStyle",
+           "StringTypes", "defproperty", "GetattrMagic"]
+
+import xml.dom
+
+try:
+    unicode
+except NameError:
+    StringTypes = type(''),
+else:
+    StringTypes = type(''), type(unicode(''))
+
+
+# define True and False only if not defined as built-ins
+try:
+    True
+except NameError:
+    True = 1
+    False = 0
+    __all__.extend(["True", "False"])
+
+
+try:
+    isinstance('', StringTypes)
+except TypeError:
+    #
+    # Wrap isinstance() to make it compatible with the version in
+    # Python 2.2 and newer.
+    #
+    _isinstance = isinstance
+    def isinstance(obj, type_or_seq):
+        try:
+            return _isinstance(obj, type_or_seq)
+        except TypeError:
+            for t in type_or_seq:
+                if _isinstance(obj, t):
+                    return 1
+            return 0
+    __all__.append("isinstance")
+
+
+if list is type([]):
+    class NodeList(list):
+        __slots__ = ()
+
+        def item(self, index):
+            if 0 <= index < len(self):
+                return self[index]
+
+        def _get_length(self):
+            return len(self)
+
+        def _set_length(self, value):
+            raise xml.dom.NoModificationAllowedErr(
+                "attempt to modify read-only attribute 'length'")
+
+        length = property(_get_length, _set_length,
+                          doc="The number of nodes in the NodeList.")
+
+        def __getstate__(self):
+            return list(self)
+
+        def __setstate__(self, state):
+            self[:] = state
+
+    class EmptyNodeList(tuple):
+        __slots__ = ()
+
+        def __add__(self, other):
+            NL = NodeList()
+            NL.extend(other)
+            return NL
+
+        def __radd__(self, other):
+            NL = NodeList()
+            NL.extend(other)
+            return NL
+
+        def item(self, index):
+            return None
+
+        def _get_length(self):
+            return 0
+
+        def _set_length(self, value):
+            raise xml.dom.NoModificationAllowedErr(
+                "attempt to modify read-only attribute 'length'")
+
+        length = property(_get_length, _set_length,
+                          doc="The number of nodes in the NodeList.")
+
+else:
+    def NodeList():
+        return []
+
+    def EmptyNodeList():
+        return []
+
+
+try:
+    property
+except NameError:
+    def defproperty(klass, name, doc):
+        # taken care of by the base __getattr__()
+        pass
+
+    class GetattrMagic:
+        def __getattr__(self, key):
+            if key.startswith("_"):
+                raise AttributeError, key
+
+            try:
+                get = getattr(self, "_get_" + key)
+            except AttributeError:
+                raise AttributeError, key
+            return get()
+
+    class NewStyle:
+        pass
+
+else:
+    def defproperty(klass, name, doc):
+        get = getattr(klass, ("_get_" + name)).im_func
+        def set(self, value, name=name):
+            raise xml.dom.NoModificationAllowedErr(
+                "attempt to modify read-only attribute " + repr(name))
+        assert not hasattr(klass, "_set_" + name), \
+               "expected not to find _set_" + name
+        prop = property(get, set, doc=doc)
+        setattr(klass, name, prop)
+
+    class GetattrMagic:
+        pass
+
+    NewStyle = object