2121 _is_data_element_group ,
2222 _is_segment ,
2323 _is_segment_group ,
24+ _is_uebertragungsdatei ,
2425)
2526
2627
@@ -117,6 +118,13 @@ def _to_segment_group(element: ET.Element) -> SegmentGroup:
117118 )
118119
119120
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+
120128class MigReader :
121129 """
122130 Accesses information from an XML based message implementation guide
@@ -133,26 +141,31 @@ def get_publishing_date(self) -> date:
133141 """
134142 returns the publishing date of the message implementation guide
135143 """
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'
137146 result = datetime .strptime (raw_value , "%d.%m.%Y" ).date ()
138147 return result
139148
140149 def get_author (self ) -> str :
141150 """
142151 returns the author of the message implementation guide
143152 """
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" ]
145155
146156 def get_version (self ) -> str :
147157 """
148158 returns the version of the message implementation guide
149159 """
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" ]
151162
152163 def get_format (self ) -> str :
153164 """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'
156169
157170 def _iter_segments_and_segment_groups (self , element : ET .Element ) -> list [SegmentGroup | Segment ]:
158171 """recursive function that builds a list of all segments and segment groups"""
@@ -168,7 +181,13 @@ def read(self) -> MessageImplementationGuide:
168181 read the entire file and convert it to a MessageImplementationGuid instance
169182 """
170183 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 ):
172191 if index == 0 :
173192 continue
174193 segments_and_groups .extend (self ._iter_segments_and_segment_groups (element ))
0 commit comments