2 Created on Jan 24, 2014
8 from xml.etree import ElementTree as ET
10 from convertor_tools import ConvertorTools
16 def get_element_alias_by_key(element,key_dict):
17 return key_dict.get(element.tag) if (key_dict.get(element.tag, None) > None) else None
20 def sort_ordered_dict_to_array(x_dict=None):
23 for val in map(lambda val: x_dict.get(val), sorted(x_dict.keys())) :
25 # if (out_put > None) :
26 # out_put += ', %s' %val
29 return ', '.join(out_put)
33 def get_element_value(element):
34 return (re.sub('[\s]+', '', element.text, count=1)).lower() if element.text > None else ''
37 def __parse_ordered_tags_from_xml(element, kwd, p_elm_n=None, ikwd=None, ord_value=None):
40 elm_n = ParseTools.get_element_alias_by_key(element, kwd)
41 if ((element.getchildren() > None) & (len(element.getchildren()) > 0)) :
43 for child in element.getchildren() :
44 if (child.tag == 'order') :
45 ord_value = ParseTools.get_element_value(child)
47 sub_dict.update(ParseTools.__parse_ordered_tags_from_xml(child, kwd, p_elm_n, ikwd))
49 a_value = ParseTools.sort_ordered_dict_to_array(sub_dict)
50 if (ord_value > None) :
51 order = ord_value if (len(ord_value) > 0) else '0'
57 if (ord_value > None) :
58 order = ord_value if ((len(ord_value) > 0)) else '0'
61 a_val = elm_n if elm_n > None else element.tag
67 def __parse_tags_from_xml(element, flow_dict, kwd, p_elm_n=None, ikwd=None):
69 # find and translate element.tag in key_word_dictionary
70 elm_n = ParseTools.get_element_alias_by_key(element, kwd)
71 if ((element.getchildren() > None) & (len(element.getchildren()) > 0)) :
72 for child in element.getchildren() :
73 new_p_elm_n = elm_n if elm_n > None else p_elm_n
74 ParseTools.__parse_tags_from_xml(child, flow_dict, kwd, new_p_elm_n, ikwd)
76 # prefer parent element_name before elment_name and element_name before element.tag
77 a_key = elm_n if elm_n > None else p_elm_n if (p_elm_n > None) else element.tag
78 a_value = ParseTools.get_element_value(element)
79 # Don't continue for ignore tags
81 if (ikwd.get(a_key, None) > None) :
82 # TODO add check for cookie_mask (mask has to have same or more length as cookie if is more as 0)
84 flow_dict[a_key] = ConvertorTools.base_tag_values_conversion(a_key, a_value)
87 def get_switchflow_from_xml(xml_string, key_dict=None, action_key_dict=None, match_key_dict=None, ignore_key_dict=None):
88 if xml_string > None :
90 xml_string = re.sub(' xmlns="[^"]+"', '', xml_string, count=1)
91 tree = ET.fromstring(xml_string)
96 if (tree.getchildren() > None) :
97 for child in tree.getchildren() :
98 if (child.tag == 'match') :
99 ParseTools.__parse_tags_from_xml(child, flow_dict, match_key_dict, ikwd=ignore_key_dict)
100 elif (child.tag == 'instructions') :
101 x_dict = ParseTools.__parse_ordered_tags_from_xml(child, action_key_dict, ikwd=ignore_key_dict)
102 flow_dict['actions'] = ParseTools.sort_ordered_dict_to_array(x_dict)
104 ParseTools.__parse_tags_from_xml(child, flow_dict, key_dict, ikwd=ignore_key_dict)
108 # TODO VD remove this method
110 # def get_switchflow_dict(switch_dict, ignore_key_dict=None):
112 # for sw_key in switch_dict.keys() :
113 # if (ignore_key_dict.get(sw_key,None) is None):
114 # x_dict[sw_key] = switch_dict.get(sw_key)
119 def all_nodes(xml_root):
121 Generates every non-text nodes.
123 current_nodes = [xml_root]
126 while len(current_nodes) > 0:
127 for node in current_nodes:
128 if node.nodeType != xml_root.TEXT_NODE:
130 next_nodes.extend(node.childNodes)
132 current_nodes, next_nodes = next_nodes, []
135 def get_values(node, *tags):
136 result = dict((tag, None) for tag in tags)
137 # result = {tag: None for tag in tags}
138 for node in ParseTools.all_nodes(node):
139 if node.nodeName in result and len(node.childNodes) > 0:
140 result[node.nodeName] = node.childNodes[0].nodeValue
144 def dump_string_to_dict(dump_string):
145 dump_list = ParseTools.dump_string_to_list(dump_string)
146 return ParseTools.dump_list_to_dict(dump_list)
149 def dump_string_to_list(dump_string):
151 for item in dump_string.split():
152 out_list.extend(item.rstrip(',').split(','))
157 def dump_list_to_dict(dump_list):
159 for item in dump_list:
160 parts = item.split('=')
163 out_dict[parts[0]] = parts[1]