1 import xml.parsers.expat
2 from concurrent_tree_crawler.abstract_node import AbstractNode, NodeState
3
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
29
31 print >>self.__f, "{}{}".format("\t"*level, text)
32
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
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
52 if name == "tree":
53 return
54 if name == "node":
55 self.__curr_node = self.__curr_node.get_parent()
56
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