@@ -631,7 +631,7 @@ def _serialize(self, target_obj, data_type=None, **kwargs):
631
631
if xml_desc .get ("attr" , False ):
632
632
if xml_ns :
633
633
ET .register_namespace (xml_prefix , xml_ns )
634
- xml_name = "{}{}" .format (xml_ns , xml_name )
634
+ xml_name = "{{{}} }{}" .format (xml_ns , xml_name )
635
635
serialized .set (xml_name , new_attr ) # type: ignore
636
636
continue
637
637
if xml_desc .get ("text" , False ):
@@ -664,8 +664,9 @@ def _serialize(self, target_obj, data_type=None, **kwargs):
664
664
_serialized .update (_new_attr ) # type: ignore
665
665
_new_attr = _new_attr [k ] # type: ignore
666
666
_serialized = _serialized [k ]
667
- except ValueError :
668
- continue
667
+ except ValueError as err :
668
+ if isinstance (err , SerializationError ):
669
+ raise
669
670
670
671
except (AttributeError , KeyError , TypeError ) as err :
671
672
msg = "Attribute {} in object {} cannot be serialized.\n {}" .format (attr_name , class_name , str (target_obj ))
@@ -743,6 +744,8 @@ def query(self, name, data, data_type, **kwargs):
743
744
744
745
:param data: The data to be serialized.
745
746
:param str data_type: The type to be serialized from.
747
+ :keyword bool skip_quote: Whether to skip quote the serialized result.
748
+ Defaults to False.
746
749
:rtype: str
747
750
:raises: TypeError if serialization fails.
748
751
:raises: ValueError if data is None
@@ -751,10 +754,8 @@ def query(self, name, data, data_type, **kwargs):
751
754
# Treat the list aside, since we don't want to encode the div separator
752
755
if data_type .startswith ("[" ):
753
756
internal_data_type = data_type [1 :- 1 ]
754
- data = [self .serialize_data (d , internal_data_type , ** kwargs ) if d is not None else "" for d in data ]
755
- if not kwargs .get ("skip_quote" , False ):
756
- data = [quote (str (d ), safe = "" ) for d in data ]
757
- return str (self .serialize_iter (data , internal_data_type , ** kwargs ))
757
+ do_quote = not kwargs .get ('skip_quote' , False )
758
+ return str (self .serialize_iter (data , internal_data_type , do_quote = do_quote , ** kwargs ))
758
759
759
760
# Not a list, regular serialization
760
761
output = self .serialize_data (data , data_type , ** kwargs )
@@ -893,6 +894,8 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
893
894
not be None or empty.
894
895
:param str div: If set, this str will be used to combine the elements
895
896
in the iterable into a combined string. Default is 'None'.
897
+ :keyword bool do_quote: Whether to quote the serialized result of each iterable element.
898
+ Defaults to False.
896
899
:rtype: list, str
897
900
"""
898
901
if isinstance (data , str ):
@@ -905,9 +908,18 @@ def serialize_iter(self, data, iter_type, div=None, **kwargs):
905
908
for d in data :
906
909
try :
907
910
serialized .append (self .serialize_data (d , iter_type , ** kwargs ))
908
- except ValueError :
911
+ except ValueError as err :
912
+ if isinstance (err , SerializationError ):
913
+ raise
909
914
serialized .append (None )
910
915
916
+ if kwargs .get ('do_quote' , False ):
917
+ serialized = [
918
+ '' if s is None else quote (str (s ), safe = '' )
919
+ for s
920
+ in serialized
921
+ ]
922
+
911
923
if div :
912
924
serialized = ["" if s is None else str (s ) for s in serialized ]
913
925
serialized = div .join (serialized )
@@ -952,7 +964,9 @@ def serialize_dict(self, attr, dict_type, **kwargs):
952
964
for key , value in attr .items ():
953
965
try :
954
966
serialized [self .serialize_unicode (key )] = self .serialize_data (value , dict_type , ** kwargs )
955
- except ValueError :
967
+ except ValueError as err :
968
+ if isinstance (err , SerializationError ):
969
+ raise
956
970
serialized [self .serialize_unicode (key )] = None
957
971
958
972
if "xml" in serialization_ctxt :
@@ -1273,7 +1287,7 @@ def _extract_name_from_internal_type(internal_type):
1273
1287
xml_name = internal_type_xml_map .get ("name" , internal_type .__name__ )
1274
1288
xml_ns = internal_type_xml_map .get ("ns" , None )
1275
1289
if xml_ns :
1276
- xml_name = "{}{}" .format (xml_ns , xml_name )
1290
+ xml_name = "{{{}} }{}" .format (xml_ns , xml_name )
1277
1291
return xml_name
1278
1292
1279
1293
@@ -1297,7 +1311,7 @@ def xml_key_extractor(attr, attr_desc, data):
1297
1311
# Integrate namespace if necessary
1298
1312
xml_ns = xml_desc .get ("ns" , internal_type_xml_map .get ("ns" , None ))
1299
1313
if xml_ns :
1300
- xml_name = "{}{}" .format (xml_ns , xml_name )
1314
+ xml_name = "{{{}} }{}" .format (xml_ns , xml_name )
1301
1315
1302
1316
# If it's an attribute, that's simple
1303
1317
if xml_desc .get ("attr" , False ):
0 commit comments