1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
'''
Event-driven, almost-SAXish, grove builder.
'''
from xml.dom.core import *
import string
_LEGAL_DOCUMENT_CHILDREN = (ELEMENT_NODE, PROCESSING_INSTRUCTION_NODE,
COMMENT_NODE)
class Builder:
def __init__(self):
self.document = createDocument()
self.current_element = None
def push(self, node):
"Add node to current node and move to new node."
nodetype = node.get_nodeType()
if self.current_element:
self.current_element.insertBefore(node, None)
elif nodetype in _LEGAL_DOCUMENT_CHILDREN:
if nodetype == TEXT_NODE:
if string.strip(node.get_nodeValue()) != "":
self.document.appendChild(node)
else:
self.document.appendChild(node)
if nodetype == ELEMENT_NODE:
self.current_element = node
def pop(self):
"Move to current node's parent."
self.current_element = self.current_element.get_parentNode()
def startElement(self, name, attrs = {}):
if hasattr(self, 'start_' + name):
getattr(self, 'start_' + name)(elm)
else:
element = self.document.createElement(name)
for key, value in attrs.items():
element.setAttribute(key, value)
self.push(element)
def endElement(self, name):
assert name == self.current_element.get_nodeName()
self.pop()
def processingInstruction(self, target, data):
node = self.document.createProcessingInstruction(target, data)
self.push(node)
def text(self, s):
if self.current_element:
text_node = self.document.createTextNode(s)
if (self.current_element == self.document and
string.strip(s) == ""):
return
self.current_element.insertBefore(text_node, None)
|