@@ -2010,14 +2010,15 @@ pub use self::resolver::{EntityResolver, PredefinedEntityResolver};
2010
2010
pub use self :: simple_type:: SimpleTypeDeserializer ;
2011
2011
pub use crate :: errors:: serialize:: DeError ;
2012
2012
2013
+ use crate :: name:: { LocalName , Namespace , PrefixDeclaration , ResolveResult } ;
2013
2014
use crate :: {
2014
2015
de:: map:: ElementMapAccess ,
2015
2016
encoding:: Decoder ,
2016
2017
errors:: Error ,
2017
2018
events:: { BytesCData , BytesEnd , BytesStart , BytesText , Event } ,
2018
2019
name:: QName ,
2019
- reader:: Reader ,
2020
2020
utils:: CowRef ,
2021
+ NsReader ,
2021
2022
} ;
2022
2023
use serde:: de:: {
2023
2024
self , Deserialize , DeserializeOwned , DeserializeSeed , IntoDeserializer , SeqAccess , Visitor ,
@@ -2534,6 +2535,17 @@ where
2534
2535
}
2535
2536
}
2536
2537
2538
+ fn readable_peek ( & self ) -> Option < & DeEvent < ' de > > {
2539
+ #[ cfg( not( feature = "overlapped-lists" ) ) ]
2540
+ {
2541
+ self . peek . as_ref ( )
2542
+ }
2543
+ #[ cfg( feature = "overlapped-lists" ) ]
2544
+ {
2545
+ self . read . front ( )
2546
+ }
2547
+ }
2548
+
2537
2549
fn next ( & mut self ) -> Result < DeEvent < ' de > , DeError > {
2538
2550
// Replay skipped or peeked events
2539
2551
#[ cfg( feature = "overlapped-lists" ) ]
@@ -2764,6 +2776,14 @@ where
2764
2776
}
2765
2777
self . reader . read_to_end ( name)
2766
2778
}
2779
+
2780
+ fn skip_nil_tag ( & mut self ) -> Result < ( ) , DeError > {
2781
+ let DeEvent :: Start ( start) = self . next ( ) ? else {
2782
+ unreachable ! ( "Only call this if the next event is a start event" )
2783
+ } ;
2784
+ let name = start. name ( ) ;
2785
+ self . read_to_end ( name)
2786
+ }
2767
2787
}
2768
2788
2769
2789
impl < ' de > Deserializer < ' de , SliceReader < ' de > > {
@@ -2783,7 +2803,7 @@ where
2783
2803
/// Create new deserializer that will borrow data from the specified string
2784
2804
/// and use specified entity resolver.
2785
2805
pub fn from_str_with_resolver ( source : & ' de str , entity_resolver : E ) -> Self {
2786
- let mut reader = Reader :: from_str ( source) ;
2806
+ let mut reader = NsReader :: from_str ( source) ;
2787
2807
let config = reader. config_mut ( ) ;
2788
2808
config. expand_empty_elements = true ;
2789
2809
@@ -2826,7 +2846,7 @@ where
2826
2846
/// will borrow instead of copy. If you have `&[u8]` which is known to represent
2827
2847
/// UTF-8, you can decode it first before using [`from_str`].
2828
2848
pub fn with_resolver ( reader : R , entity_resolver : E ) -> Self {
2829
- let mut reader = Reader :: from_reader ( reader) ;
2849
+ let mut reader = NsReader :: from_reader ( reader) ;
2830
2850
let config = reader. config_mut ( ) ;
2831
2851
config. expand_empty_elements = true ;
2832
2852
@@ -2945,9 +2965,17 @@ where
2945
2965
where
2946
2966
V : Visitor < ' de > ,
2947
2967
{
2948
- match self . peek ( ) ? {
2968
+ let _ = self . peek ( ) ?;
2969
+ match self . readable_peek ( ) . expect ( "This exists as we called peek before" ) {
2949
2970
DeEvent :: Text ( t) if t. is_empty ( ) => visitor. visit_none ( ) ,
2950
2971
DeEvent :: Eof => visitor. visit_none ( ) ,
2972
+ DeEvent :: Start ( start)
2973
+ // if the `xsi:nil` attribute is set to true we got a none value
2974
+ if start. has_nil_attr ( & self . reader . reader ) =>
2975
+ {
2976
+ self . skip_nil_tag ( ) ?;
2977
+ visitor. visit_none ( )
2978
+ }
2951
2979
_ => visitor. visit_some ( self ) ,
2952
2980
}
2953
2981
}
@@ -3071,14 +3099,22 @@ pub trait XmlRead<'i> {
3071
3099
3072
3100
/// A copy of the reader's decoder used to decode strings.
3073
3101
fn decoder ( & self ) -> Decoder ;
3102
+
3103
+ /// Resolves a potentially qualified **attribute name** into _(namespace name, local name)_.
3104
+ ///
3105
+ /// See [`NsReader::resolve_attribute`] for details
3106
+ fn resolve_attribute < ' n > ( & self , name : QName < ' n > ) -> ( ResolveResult , LocalName < ' n > ) ;
3107
+
3108
+ /// Get the current default namespace
3109
+ fn default_namespace ( & self ) -> Option < Namespace < ' _ > > ;
3074
3110
}
3075
3111
3076
3112
/// XML input source that reads from a std::io input stream.
3077
3113
///
3078
3114
/// You cannot create it, it is created automatically when you call
3079
3115
/// [`Deserializer::from_reader`]
3080
3116
pub struct IoReader < R : BufRead > {
3081
- reader : Reader < R > ,
3117
+ reader : NsReader < R > ,
3082
3118
start_trimmer : StartTrimmer ,
3083
3119
buf : Vec < u8 > ,
3084
3120
}
@@ -3113,7 +3149,7 @@ impl<R: BufRead> IoReader<R> {
3113
3149
/// assert_eq!(reader.error_position(), 28);
3114
3150
/// assert_eq!(reader.buffer_position(), 41);
3115
3151
/// ```
3116
- pub const fn get_ref ( & self ) -> & Reader < R > {
3152
+ pub const fn get_ref ( & self ) -> & NsReader < R > {
3117
3153
& self . reader
3118
3154
}
3119
3155
}
@@ -3140,14 +3176,28 @@ impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
3140
3176
fn decoder ( & self ) -> Decoder {
3141
3177
self . reader . decoder ( )
3142
3178
}
3179
+
3180
+ fn resolve_attribute < ' n > ( & self , name : QName < ' n > ) -> ( ResolveResult , LocalName < ' n > ) {
3181
+ self . reader . resolve_attribute ( name)
3182
+ }
3183
+
3184
+ fn default_namespace ( & self ) -> Option < Namespace < ' _ > > {
3185
+ self . reader . prefixes ( ) . find_map ( |( key, value) | {
3186
+ if PrefixDeclaration :: Default == key {
3187
+ Some ( value)
3188
+ } else {
3189
+ None
3190
+ }
3191
+ } )
3192
+ }
3143
3193
}
3144
3194
3145
3195
/// XML input source that reads from a slice of bytes and can borrow from it.
3146
3196
///
3147
3197
/// You cannot create it, it is created automatically when you call
3148
3198
/// [`Deserializer::from_str`].
3149
3199
pub struct SliceReader < ' de > {
3150
- reader : Reader < & ' de [ u8 ] > ,
3200
+ reader : NsReader < & ' de [ u8 ] > ,
3151
3201
start_trimmer : StartTrimmer ,
3152
3202
}
3153
3203
@@ -3180,7 +3230,7 @@ impl<'de> SliceReader<'de> {
3180
3230
/// assert_eq!(reader.error_position(), 28);
3181
3231
/// assert_eq!(reader.buffer_position(), 41);
3182
3232
/// ```
3183
- pub const fn get_ref ( & self ) -> & Reader < & ' de [ u8 ] > {
3233
+ pub const fn get_ref ( & self ) -> & NsReader < & ' de [ u8 ] > {
3184
3234
& self . reader
3185
3235
}
3186
3236
}
@@ -3205,6 +3255,20 @@ impl<'de> XmlRead<'de> for SliceReader<'de> {
3205
3255
fn decoder ( & self ) -> Decoder {
3206
3256
self . reader . decoder ( )
3207
3257
}
3258
+
3259
+ fn resolve_attribute < ' n > ( & self , name : QName < ' n > ) -> ( ResolveResult , LocalName < ' n > ) {
3260
+ self . reader . resolve_attribute ( name)
3261
+ }
3262
+
3263
+ fn default_namespace ( & self ) -> Option < Namespace < ' _ > > {
3264
+ self . reader . prefixes ( ) . find_map ( |( key, value) | {
3265
+ if PrefixDeclaration :: Default == key {
3266
+ Some ( value)
3267
+ } else {
3268
+ None
3269
+ }
3270
+ } )
3271
+ }
3208
3272
}
3209
3273
3210
3274
#[ cfg( test) ]
@@ -3781,12 +3845,12 @@ mod tests {
3781
3845
"# ;
3782
3846
3783
3847
let mut reader1 = IoReader {
3784
- reader : Reader :: from_reader ( s. as_bytes ( ) ) ,
3848
+ reader : NsReader :: from_reader ( s. as_bytes ( ) ) ,
3785
3849
start_trimmer : StartTrimmer :: default ( ) ,
3786
3850
buf : Vec :: new ( ) ,
3787
3851
} ;
3788
3852
let mut reader2 = SliceReader {
3789
- reader : Reader :: from_str ( s) ,
3853
+ reader : NsReader :: from_str ( s) ,
3790
3854
start_trimmer : StartTrimmer :: default ( ) ,
3791
3855
} ;
3792
3856
@@ -3812,7 +3876,7 @@ mod tests {
3812
3876
"# ;
3813
3877
3814
3878
let mut reader = SliceReader {
3815
- reader : Reader :: from_str ( s) ,
3879
+ reader : NsReader :: from_str ( s) ,
3816
3880
start_trimmer : StartTrimmer :: default ( ) ,
3817
3881
} ;
3818
3882
0 commit comments