21
21
_is_data_element_group ,
22
22
_is_segment ,
23
23
_is_segment_group ,
24
+ _is_uebertragungsdatei ,
24
25
)
25
26
26
27
@@ -117,6 +118,13 @@ def _to_segment_group(element: ET.Element) -> SegmentGroup:
117
118
)
118
119
119
120
121
+ def _get_first_tag_starting_with_m (element : ET .Element ) -> ET .Element :
122
+ for elem in element .iter ():
123
+ if elem .tag .startswith ("M_" ):
124
+ return elem
125
+ raise ValueError ("No element starting with M_ found" )
126
+
127
+
120
128
class MigReader :
121
129
"""
122
130
Accesses information from an XML based message implementation guide
@@ -133,26 +141,31 @@ def get_publishing_date(self) -> date:
133
141
"""
134
142
returns the publishing date of the message implementation guide
135
143
"""
136
- raw_value = self ._element_tree .getroot ().attrib ["Veroeffentlichungsdatum" ] # e.g. '24.10.2023'
144
+ root = self ._element_tree .getroot () # might be either <M_FORMAT> or <Uebertragungsdatei>
145
+ raw_value = root .attrib ["Veroeffentlichungsdatum" ] # e.g. '24.10.2023'
137
146
result = datetime .strptime (raw_value , "%d.%m.%Y" ).date ()
138
147
return result
139
148
140
149
def get_author (self ) -> str :
141
150
"""
142
151
returns the author of the message implementation guide
143
152
"""
144
- return self ._element_tree .getroot ().attrib ["Author" ]
153
+ root = self ._element_tree .getroot () # might be either <M_FORMAT> or <Uebertragungsdatei>
154
+ return root .attrib ["Author" ]
145
155
146
156
def get_version (self ) -> str :
147
157
"""
148
158
returns the version of the message implementation guide
149
159
"""
150
- return self ._element_tree .getroot ().attrib ["Versionsnummer" ]
160
+ root = self ._element_tree .getroot () # might be either <M_FORMAT> or <Uebertragungsdatei>
161
+ return root .attrib ["Versionsnummer" ]
151
162
152
163
def get_format (self ) -> str :
153
164
"""returns the format of the message implementation guide, e.g. 'UTILTS'"""
154
- root_tag : str = self ._element_tree .getroot ().tag
155
- return root_tag .lstrip ("M_" ) # converts 'M_UTILTS' to 'UTILTS'
165
+ root = self ._element_tree .getroot ()
166
+ if _is_uebertragungsdatei (root ):
167
+ root = _get_first_tag_starting_with_m (root )
168
+ return root .tag .lstrip ("M_" ) # converts 'M_UTILTS' to 'UTILTS'
156
169
157
170
def _iter_segments_and_segment_groups (self , element : ET .Element ) -> list [SegmentGroup | Segment ]:
158
171
"""recursive function that builds a list of all segments and segment groups"""
@@ -168,7 +181,13 @@ def read(self) -> MessageImplementationGuide:
168
181
read the entire file and convert it to a MessageImplementationGuid instance
169
182
"""
170
183
segments_and_groups = []
171
- for index , element in enumerate (self ._element_tree .getroot ()):
184
+ root = self ._element_tree .getroot ()
185
+ if _is_uebertragungsdatei (root ):
186
+ for elem in root .iter ():
187
+ if elem .tag .startswith ("M_" ):
188
+ root = elem
189
+ break
190
+ for index , element in enumerate (root ):
172
191
if index == 0 :
173
192
continue
174
193
segments_and_groups .extend (self ._iter_segments_and_segment_groups (element ))
0 commit comments