@@ -637,6 +637,9 @@ def read_wfs_service_capabilities(self, service_name, item):
637637 wfs_layer = OrderedDict ()
638638
639639 layer_name = layer .find ('%sName' % np , ns ).text
640+ # NOTE: ensure special characters in layer names are consistently replaced (varies across QGIS WFS versions)
641+ layer_name = layer_name .replace (' ' , '_' ).replace (':' , '-' )
642+
640643 wfs_layer ['name' ] = layer_name
641644 wfs_layer ['title' ] = layer .find ('%sTitle' % np , ns ).text
642645 wfs_layer ['attributes' ] = wfs_layers_attributes .get (layer_name , [])
@@ -720,15 +723,19 @@ def collect_wfs_layers_attributes(self, full_url):
720723 np = ''
721724
722725 layers_attributes = {}
726+ replace_unicode_pat = re .compile (r'[^\w.\-_]' , flags = re .UNICODE )
723727
724728 for complex_type in root .findall ('%scomplexType' % np , ns ):
725729 # extract layer name from complexType by removing "Type" suffix
726730 # e.g. "edit_pointsType" -> "edit_points"
727731 layer_name = complex_type .get ('name' ).removesuffix ('Type' )
728732
729- attributes = []
733+ attributes = {}
730734 for element in complex_type .findall ('%scomplexContent/%sextension/%ssequence/%selement' % (np , np , np , np ), ns ):
731- attributes .append (element .get ('name' ))
735+ attribute_name = element .get ('name' )
736+ # NOTE: ensure special characters in attribute names are consistently replaced (varies across QGIS WFS versions)
737+ attribute_name = replace_unicode_pat .sub ('' , attribute_name .replace (' ' , '_' ))
738+ attributes [attribute_name ] = element .get ('alias' , attribute_name )
732739
733740 layers_attributes [layer_name ] = attributes
734741
0 commit comments