88# @author Davide Brunato <brunato@sissa.it>
99#
1010import importlib
11- from collections import deque
11+ from collections import defaultdict , deque
1212from collections .abc import Iterator
1313from urllib .parse import urljoin
1414from typing import cast , Any , Optional
@@ -1232,6 +1232,9 @@ def apply_schema(self, schema: ta.SchemaProxyType) -> None:
12321232 delattr (root_node , '_attributes' )
12331233
12341234 iterators : deque [Any ] = deque ()
1235+ element_match_cache : defaultdict [
1236+ int , dict [str | None , XsdElementProtocol | None ]
1237+ ] = defaultdict (dict )
12351238 while True :
12361239 for node in children :
12371240 if not isinstance (node , EtreeElementNode ):
@@ -1250,12 +1253,15 @@ def apply_schema(self, schema: ta.SchemaProxyType) -> None:
12501253 xsd_element = schema .get_element (node .name )
12511254 elif (content := xsd_types [- 1 ].model_group ) is None :
12521255 xsd_element = None
1256+ elif node .name in (sub_cache := element_match_cache [id (content )]):
1257+ xsd_element = sub_cache [node .name ]
12531258 else :
12541259 for xsd_element in content .iter_elements ():
12551260 if xsd_element .is_matching (node .name ):
12561261 if xsd_element .name != node .name :
12571262 # a wildcard or a substitute
12581263 xsd_element = schema .get_element (node .name )
1264+ sub_cache [node .name ] = xsd_element
12591265 break
12601266 else :
12611267 xsd_element = None
0 commit comments