Package concurrent_tree_crawler :: Module xml_tree_serialization
[hide private]
[frames] | no frames]

Source Code for Module concurrent_tree_crawler.xml_tree_serialization

 1  import xml.parsers.expat 
 2  from concurrent_tree_crawler.abstract_node import AbstractNode, NodeState 
 3   
4 -class XMLTreeWriter:
5 - def __init__(self, file_):
6 self.__f = file_
7
8 - def write(self, sentinel):
9 """ 10 @type sentinel: L{AbstractNode} 11 """ 12 root = sentinel.get_child("root") 13 self.__print(0, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 14 self.__print(0, "<tree>") 15 self.__print_node(1, root) 16 self.__print(0, "</tree>")
17
18 - def __print_node(self, level, node):
19 prefix_str = "<node name=\"{}\" state=\"{}\"".format( 20 node.get_name(), NodeState.to_str(node.get_state())) 21 children = node.get_children() 22 if children: 23 self.__print(level, "{}>".format(prefix_str)) 24 for child in node.get_children(): 25 self.__print_node(level+1, child) 26 self.__print(level, "</node>") 27 else: 28 self.__print(level, "{}/>".format(prefix_str))
29
30 - def __print(self, level, text):
31 print >>self.__f, "{}{}".format("\t"*level, text)
32
33 -class XMLTreeReader:
34 - def __init__(self, file_):
35 self.__file = file_ 36 self.__curr_node = None 37 self.__parser = xml.parsers.expat.ParserCreate() 38 39 self.__parser.StartElementHandler = self.__start_element 40 self.__parser.EndElementHandler = self.__end_element 41 self.__parser.CharacterDataHandler = self.__char_data
42
43 - def __start_element(self, name, attrs):
44 if name == "tree": 45 return 46 if name == "node": 47 state = NodeState.from_str(attrs["state"]) 48 node_name = attrs["name"] 49 self.__curr_node = self.__curr_node.add_child(node_name, state)
50
51 - def __end_element(self, name):
52 if name == "tree": 53 return 54 if name == "node": 55 self.__curr_node = self.__curr_node.get_parent()
56
57 - def __char_data(self, data):
58 pass
59
60 - def read(self, sentinel):
61 """ 62 @param sentinel: a node that will be treated as sentinel in the 63 newly created tree, it shouldn't have any children. 64 @type sentinel: L{AbstractNode} 65 """ 66 assert not sentinel.get_children(), \ 67 "The sentinel should be a single node, without children" 68 self.__curr_node = sentinel 69 self.__parser.ParseFile(self.__file)
70