@@ -1188,6 +1188,24 @@ def attribute_key_case_insensitive_extractor(attr, _, data):
11881188
11891189 return data .get (found_key )
11901190
1191+ def _extract_name_from_internal_type (internal_type ):
1192+ """Given an internal type XML description, extract correct XML name with namespace.
1193+
1194+ :param dict internal_type: An model type
1195+ :rtype: tuple
1196+ :returns: A tuple XML name + namespace dict
1197+ """
1198+ internal_type_xml_map = getattr (internal_type , "_xml_map" , {})
1199+ xml_name = internal_type_xml_map .get ('name' , internal_type .__name__ )
1200+ xml_ns = internal_type_xml_map .get ("ns" , None )
1201+ if xml_ns :
1202+ ns = {'prefix' : xml_ns }
1203+ xml_name = "prefix:" + xml_name
1204+ else :
1205+ ns = {} # And keep same xml_name
1206+ return xml_name , ns
1207+
1208+
11911209def xml_key_extractor (attr , attr_desc , data ):
11921210 if isinstance (data , dict ):
11931211 return None
@@ -1198,41 +1216,39 @@ def xml_key_extractor(attr, attr_desc, data):
11981216
11991217 xml_desc = attr_desc .get ('xml' , {})
12001218 xml_name = xml_desc .get ('name' , attr_desc ['key' ])
1201- xml_ns = xml_desc .get ('ns' , None )
12021219
12031220 # If it's an attribute, that's simple
12041221 if xml_desc .get ("attr" , False ):
12051222 return data .get (xml_name )
12061223
1224+ # Look for a children
1225+ is_iter_type = attr_desc ['type' ].startswith ("[" )
1226+ is_wrapped = xml_desc .get ("wrapped" , False )
1227+ internal_type = attr_desc .get ("internalType" , None )
1228+ internal_type_xml_map = getattr (internal_type , "_xml_map" , {})
1229+
12071230 # Integrate namespace if necessary
1231+ xml_ns = xml_desc .get ('ns' , internal_type_xml_map .get ("ns" , None ))
12081232 if xml_ns :
12091233 ns = {'prefix' : xml_ns }
12101234 xml_name = "prefix:" + xml_name
12111235 else :
12121236 ns = {} # And keep same xml_name
12131237
1214- # Look for a children
1215- is_iter_type = attr_desc ['type' ].startswith ("[" )
1216- is_wrapped = xml_desc .get ("wrapped" , False )
1217- internal_type = attr_desc .get ("internalType" , None )
1218-
12191238 # Scenario where I take the local name:
12201239 # - Wrapped node
12211240 # - Internal type is an enum (considered basic types)
12221241 # - Internal type has no XML/Name node
1223- internal_type_xml_map = getattr (internal_type , "_xml_map" , {})
12241242 if is_wrapped or (internal_type and (issubclass (internal_type , Enum ) or 'name' not in internal_type_xml_map )):
12251243 children = data .findall (xml_name , ns )
12261244 # If internal type has a local name and it's not a list, I use that name
12271245 elif not is_iter_type and internal_type and 'name' in internal_type_xml_map :
1228- xml_name = internal_type_xml_map ["name" ]
1229- ns = internal_type_xml_map .get ("ns" , None )
1246+ xml_name , ns = _extract_name_from_internal_type (internal_type )
12301247 children = data .findall (xml_name , ns )
12311248 # That's an array
12321249 else :
12331250 if internal_type : # Complex type, ignore itemsName and use the complex type name
1234- items_name = internal_type_xml_map .get ('name' , internal_type .__name__ )
1235- ns = internal_type_xml_map .get ("ns" , None )
1251+ items_name , ns = _extract_name_from_internal_type (internal_type )
12361252 else :
12371253 items_name = xml_desc .get ("itemsName" , xml_name )
12381254 children = data .findall (items_name , ns )
0 commit comments