Merge branch 'master' of ssh://git.f-lab.fr/git/sfa
[sfa.git] / sfa / rspecs / elements / element.py
1 from lxml import etree
2
3 class Element:
4     def __init__(self, root_node, namespaces = None):
5         self.root_node = root_node
6         self.namespaces = namespaces
7
8     def xpath(self, xpath):
9         return this.root_node.xpath(xpath, namespaces=self.namespaces) 
10
11     def add_element(self, name, attrs={}, parent=None, text=""):
12         """
13         Generic wrapper around etree.SubElement(). Adds an element to
14         specified parent node. Adds element to root node is parent is
15         not specified.
16         """
17         if parent == None:
18             parent = self.root_node
19         element = etree.SubElement(parent, name)
20         if text:
21             element.text = text
22         if isinstance(attrs, dict):
23             for attr in attrs:
24                 element.set(attr, attrs[attr])
25         return element
26
27     def remove_element(self, element_name, root_node = None):
28         """
29         Removes all occurences of an element from the tree. Start at
30         specified root_node if specified, otherwise start at tree's root.
31         """
32         if not root_node:
33             root_node = self.root_node
34
35         if not element_name.startswith('//'):
36             element_name = '//' + element_name
37
38         elements = root_node.xpath('%s ' % element_name, namespaces=self.namespaces)
39         for element in elements:
40             parent = element.getparent()
41             parent.remove(element)
42
43     
44     def add_attribute(self, elem, name, value):
45         """
46         Add attribute to specified etree element
47         """
48         opt = etree.SubElement(elem, name)
49         opt.text = value
50
51     def remove_attribute(self, elem, name, value):
52         """
53         Removes an attribute from an element
54         """
55         if not elem == None:
56             opts = elem.iterfind(name)
57             if opts is not None:
58                 for opt in opts:
59                     if opt.text == value:
60                         elem.remove(opt)
61
62     def get_attributes(self, elem=None, depth=None):
63         if elem == None:
64             elem = self.root_node
65         attrs = dict(elem.attrib)
66         attrs['text'] = str(elem.text).strip()
67         if depth is None or isinstance(depth, int) and depth > 0: 
68             for child_elem in list(elem):
69                 key = str(child_elem.tag)
70                 if key not in attrs:
71                     attrs[key] = [self.get_attributes(child_elem, recursive)]
72                 else:
73                     attrs[key].append(self.get_attributes(child_elem, recursive))
74         return attrs
75     
76     def attributes_list(self, elem):
77         # convert a list of attribute tags into list of tuples
78         # (tagnme, text_value)
79         opts = []
80         if not elem == None:
81             for e in elem:
82                 opts.append((e.tag, e.text))
83         return opts
84
85