aboutsummaryrefslogtreecommitdiff
path: root/mammoth/xmlparser.py
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-01 11:47:48 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-01 11:47:48 +0000
commitf8d72dbba832db282a3ec04a5108fbd090f49a4f (patch)
treee86971aec308963c55afde6263091f6591bb08d8 /mammoth/xmlparser.py
parent833c867189d757efb5b13e1e783869a4039860de (diff)
Move docx reading into separate package
Diffstat (limited to 'mammoth/xmlparser.py')
-rw-r--r--mammoth/xmlparser.py99
1 files changed, 0 insertions, 99 deletions
diff --git a/mammoth/xmlparser.py b/mammoth/xmlparser.py
deleted file mode 100644
index d58ea75..0000000
--- a/mammoth/xmlparser.py
+++ /dev/null
@@ -1,99 +0,0 @@
-import collections
-import xml.sax
-
-
-XmlElementBase = collections.namedtuple("XmlElement", ["name", "attributes", "children"])
-class XmlElement(XmlElementBase):
- def find_child_or_null(self, name):
- for child in self.children:
- if child.name == name:
- return child
- return _null_xml_element
-
-
-class NullXmlElement(object):
- attributes = {}
-
- def find_child_or_null(self, name):
- return self
-
-
-_null_xml_element = NullXmlElement()
-
-
-XmlText = collections.namedtuple("XmlText", ["value"])
-
-
-def element(name, attributes=None, children=None):
- return XmlElement(name, attributes or {}, children or [])
-
-text = XmlText
-
-
-class node_types(object):
- element = 1
- text = 3
-
-
-XmlElement.node_type = node_types.element
-XmlText.node_type = node_types.text
-
-
-
-def parse_xml(fileobj, namespace_mapping=None):
- if namespace_mapping is None:
- namespace_prefixes = {}
- else:
- namespace_prefixes = dict((uri, prefix) for prefix, uri in namespace_mapping)
-
- handler = Handler(namespace_prefixes)
- parser = xml.sax.make_parser()
- parser.setFeature(xml.sax.handler.feature_namespaces, True)
- parser.setContentHandler(handler)
- parser.parse(fileobj)
- return handler.root()
-
-
-class Handler(xml.sax.handler.ContentHandler):
- def __init__(self, namespace_prefixes):
- self._namespace_prefixes = namespace_prefixes
- self._element_stack = [RootElement()]
- self._character_buffer = []
-
- def root(self):
- return self._element_stack[0].children[0]
-
- def startElementNS(self, name, qname, attrs):
- self._flush_character_buffer()
- attributes = dict((self._read_name(key), value) for key, value in attrs.items())
- element = XmlElement(self._read_name(name), attributes, [])
- self._element_stack[-1].children.append(element)
- self._element_stack.append(element)
-
- def endElementNS(self, name, qname):
- self._flush_character_buffer()
- self._element_stack.pop()
-
- def characters(self, content):
- self._character_buffer.append(content)
-
- def _flush_character_buffer(self):
- if self._character_buffer:
- text = "".join(self._character_buffer)
- self._element_stack[-1].children.append(XmlText(text))
- self._character_buffer = []
-
- def _read_name(self, name):
- uri, local_name = name
- if uri is None:
- return local_name
- else:
- prefix = self._namespace_prefixes.get(uri)
- if prefix is None:
- return "{%s}%s" % (uri, local_name)
- else:
- return "%s:%s" % (prefix, local_name)
-
-class RootElement(object):
- def __init__(self):
- self.children = []