Skip to content

Commit f34b500

Browse files
committed
Untested, unfinished first cut at generating an elementtree. Will not work yet.
--HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40369
1 parent b5240b2 commit f34b500

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

src/treebuilders/elementtree.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
try:
2+
from xml.etree import ElementTree
3+
except NameError:
4+
from elementtree import ElementTree
5+
6+
import base
7+
8+
class Element(object):
9+
def __init__(self, name):
10+
self._element = ElementTree.Element()
11+
self.name = name
12+
self.parent = None
13+
14+
def _setName(self, name):
15+
self._element.tag = name
16+
17+
def _getName(self):
18+
return self._element.tag
19+
20+
name = property(_getName, _setName)
21+
22+
def _getAttributes(self):
23+
#Just return the _element which implements a dict-like interface to the attributes
24+
return self._element
25+
26+
def _setAttributes(self, attributes):
27+
#Delete existing attributes first
28+
#XXX - there may be a better way to do this...
29+
for key in self._element.attrib.keys():
30+
del self._element.attrib[key]
31+
for key, value in attributes.iteritems():
32+
self._elements.set(key) = value
33+
34+
attributes = property(_getAttributes, _setAttributes)
35+
36+
def appendChild(self, node):
37+
self._element.append(node._element)
38+
node.parent = self
39+
40+
def insertBefore(self, node, refNode):
41+
index = self._element.getChildren().index(refNode._element)
42+
self._element.insert(index, node._element)
43+
node.parent = self
44+
45+
def removeChild(self, node):
46+
self._element.remove(node._element)
47+
node.parent=None
48+
49+
def insertText(self, text, insertBefore):
50+
if not(len(self._element)):
51+
self._element.text += data
52+
elif insertBefore is None:
53+
#Insert the text as the tail of the last child element
54+
self._element[-1].tail += data
55+
else:
56+
#Insert the text before the specified node
57+
children = self._element.getChildren()
58+
index = children.index(insertBefore._element)
59+
if index > 0:
60+
self._element[index-1].tail += data
61+
else:
62+
self.text += data
63+
64+
def cloneNode(self):
65+
element = Element(self.name)
66+
element.attributes = self.attributes
67+
return element
68+
69+
class Comment(Element):
70+
71+
def __init__(self, data):
72+
self._element = ElementTree.Comment(data)
73+
self.name = None
74+
self.parent = None
75+
76+
def _getData(self):
77+
return self._element.text
78+
79+
def _setData(self, value):
80+
self._element.text = value
81+
82+
data = property(_getData, _setData)
83+
84+
class DocumentType(Element):
85+
pass
86+
87+
class TreeBuilder(base.TreeBuilder):
88+
documentClass = Element
89+
doctypeClass = DocumentType
90+
elementClass = Element
91+
commentClass = Comment
92+
93+
def getDocument(self):
94+
return self.document._element

0 commit comments

Comments
 (0)