1
2
3
4
5
6
7
8
9
10
11
12
13 """
14 Create a XML rendering of the X12 document
15 Uses node IDs as the tag names
16 """
17
18 import os.path
19 import logging
20
21
22 from errors import *
23 from x12xml import x12xml
24 from xmlwriter import XMLWriter
25 from map_walker import pop_to_parent_loop
26
27 logger = logging.getLogger('pyx12.x12xml.simple')
28
31 x12xml.__init__(self, fd, u"x12idtag", dtd_urn)
32 self.last_path = []
33
35 while len(self.writer) > 0:
36 self.writer.pop()
37
38 - def seg(self, seg_node, seg_data):
39 """
40 Generate XML for the segment data and matching map node
41
42 @param seg_node: Map Node
43 @type seg_node: L{node<map_if.x12_node>}
44 @param seg_data: Segment object
45 @type seg_data: L{segment<segment.Segment>}
46 """
47 if not seg_node.is_segment():
48 raise EngineError, 'Node must be a segment'
49 parent = pop_to_parent_loop(seg_node)
50
51 cur_path = self._path_list(parent.get_path())
52 if self.last_path != cur_path:
53 last_path = self.last_path
54 match_idx = self._get_path_match_idx(last_path, cur_path)
55 root_path = self._path_list(os.path.commonprefix(
56 ['/'.join(cur_path), '/'.join(last_path)]))
57 if seg_node.is_first_seg_in_loop() and root_path==cur_path:
58 match_idx -= 1
59 for i in range(len(last_path)-1, match_idx-1, -1):
60 self.writer.pop()
61 for i in range(match_idx, len(cur_path)):
62 (xname, attrib) = self._get_loop_info(cur_path[i])
63 self.writer.push(xname, attrib)
64 seg_node_id = self._get_node_id(seg_node, parent, seg_data)
65 (xname, attrib) = self._get_seg_info(seg_node_id)
66 self.writer.push(xname, attrib)
67 for i in range(len(seg_data)):
68 child_node = seg_node.get_child_node_by_idx(i)
69 if child_node.usage == 'N' or seg_data.get('%02i' % (i+1)).is_empty():
70 pass
71 elif child_node.is_composite():
72 (xname, attrib) = self._get_comp_info(seg_node_id)
73 self.writer.push(xname, attrib)
74 comp_data = seg_data.get('%02i' % (i+1))
75 for j in range(len(comp_data)):
76 subele_node = child_node.get_child_node_by_idx(j)
77 (xname, attrib) = self._get_subele_info(subele_node.id)
78 self.writer.elem(xname, comp_data[j].get_value(), attrib)
79 self.writer.pop()
80 elif child_node.is_element():
81 if seg_data.get_value('%02i' % (i+1)) == '':
82 pass
83
84 else:
85 (xname, attrib) = self._get_ele_info(child_node.id)
86 self.writer.elem(xname, seg_data.get_value('%02i' % (i+1)), attrib)
87 else:
88 raise EngineError, 'Node must be a either an element or a composite'
89 self.writer.pop()
90 self.last_path = cur_path
91
93 """
94 Override loop node value
95 """
96 loop_name = 'L' + loop_id
97 attrib = {}
98 return (loop_name, attrib)
99
101 """
102 Override segment node value
103 """
104 seg_name = seg_id
105 attrib = {}
106 return (seg_name, attrib)
107
109 """
110 Override composite node value
111 """
112 comp_name = comp_id
113 attrib = {}
114 return (comp_name, attrib)
115
117 """
118 Override element node value
119 """
120 name = ele_id
121 attrib = {}
122 return (name, attrib)
123
125 """
126 Override sub-element node value
127 """
128 name = subele_id
129 attrib = {}
130 return (name, attrib)
131