@@ -111,6 +111,9 @@ internal static Release Read(XmlReader reader)
111111 {
112112 ArgumentNullException . ThrowIfNull ( reader ) ;
113113
114+ if ( reader . NodeType == XmlNodeType . None )
115+ reader . MoveToContent ( ) ;
116+
114117 if ( reader . NodeType != XmlNodeType . Element )
115118 return null ;
116119 if ( reader . LocalName != RELEASE_ELEMENT )
@@ -126,28 +129,28 @@ internal static Release Read(XmlReader reader)
126129 {
127130 switch ( reader . LocalName )
128131 {
129- case nameof ( Release . Title ) :
130- if ( reader . Read ( ) && reader . NodeType == XmlNodeType . Text )
132+ case TITLE_ELEMENT :
133+ if ( reader . Read ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
131134 release . Title = reader . Value ;
132135
133136 break ;
134- case nameof ( Release . Summary ) :
135- if ( reader . Read ( ) && reader . NodeType == XmlNodeType . Text )
137+ case SUMMARY_ELEMENT :
138+ if ( reader . Read ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
136139 release . Summary = reader . Value ;
137140
138141 break ;
139- case nameof ( Release . Description ) :
140- if ( reader . Read ( ) && reader . NodeType == XmlNodeType . Text )
142+ case DESCRIPTION_ELEMENT :
143+ if ( reader . Read ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
141144 release . Description = reader . Value ;
142145
143146 break ;
144- case nameof ( TAGS_ELEMENT ) :
147+ case TAGS_ELEMENT :
145148 PopulateTags ( release , reader ) ;
146149 break ;
147- case nameof ( EXECUTORS_ELEMENT ) :
150+ case EXECUTORS_ELEMENT :
148151 PopulateExecutors ( release , reader ) ;
149152 break ;
150- case nameof ( PROPERTIES_ELEMENT ) :
153+ case PROPERTIES_ELEMENT :
151154 PopulateProperties ( release , reader ) ;
152155 break ;
153156 }
@@ -167,6 +170,9 @@ internal static async ValueTask<Release> ReadAsync(XmlReader reader, Cancellatio
167170 {
168171 ArgumentNullException . ThrowIfNull ( reader ) ;
169172
173+ if ( reader . NodeType == XmlNodeType . None )
174+ await reader . MoveToContentAsync ( ) ;
175+
170176 if ( reader . NodeType != XmlNodeType . Element )
171177 return null ;
172178 if ( reader . LocalName != RELEASE_ELEMENT )
@@ -182,28 +188,28 @@ internal static async ValueTask<Release> ReadAsync(XmlReader reader, Cancellatio
182188 {
183189 switch ( reader . LocalName )
184190 {
185- case nameof ( Release . Title ) :
186- if ( await reader . ReadAsync ( ) && reader . NodeType == XmlNodeType . Text )
191+ case TITLE_ELEMENT :
192+ if ( await reader . ReadAsync ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
187193 release . Title = reader . Value ;
188194
189195 break ;
190- case nameof ( Release . Summary ) :
191- if ( await reader . ReadAsync ( ) && reader . NodeType == XmlNodeType . Text )
196+ case SUMMARY_ELEMENT :
197+ if ( await reader . ReadAsync ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
192198 release . Summary = reader . Value ;
193199
194200 break ;
195- case nameof ( Release . Description ) :
196- if ( await reader . ReadAsync ( ) && reader . NodeType == XmlNodeType . Text )
201+ case DESCRIPTION_ELEMENT :
202+ if ( await reader . ReadAsync ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
197203 release . Description = reader . Value ;
198204
199205 break ;
200- case nameof ( TAGS_ELEMENT ) :
206+ case TAGS_ELEMENT :
201207 PopulateTags ( release , reader ) ;
202208 break ;
203- case nameof ( EXECUTORS_ELEMENT ) :
209+ case EXECUTORS_ELEMENT :
204210 PopulateExecutors ( release , reader ) ;
205211 break ;
206- case nameof ( PROPERTIES_ELEMENT ) :
212+ case PROPERTIES_ELEMENT :
207213 PopulateProperties ( release , reader ) ;
208214 break ;
209215 }
@@ -242,7 +248,10 @@ static void PopulateExecutors(Release release, XmlReader reader)
242248 var @event = reader . GetAttribute ( EVENT_ATTRIBUTE ) ;
243249
244250 if ( string . IsNullOrWhiteSpace ( @event ) )
251+ {
245252 reader . Skip ( ) ;
253+ continue ;
254+ }
246255
247256 if ( reader . Read ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
248257 release . Executors . Add ( new ( @event , reader . Value ) ) ;
@@ -261,7 +270,10 @@ static void PopulateProperties(Release release, XmlReader reader)
261270 var name = reader . GetAttribute ( NAME_ATTRIBUTE ) ;
262271
263272 if ( string . IsNullOrWhiteSpace ( name ) )
273+ {
264274 reader . Skip ( ) ;
275+ continue ;
276+ }
265277
266278 if ( reader . Read ( ) && ( reader . NodeType == XmlNodeType . Text || reader . NodeType == XmlNodeType . CDATA ) )
267279 {
@@ -284,44 +296,47 @@ static void PopulateAttributes(Release release, XmlReader reader)
284296
285297 switch ( reader . LocalName )
286298 {
287- case nameof ( Release . Name ) :
299+ case NAME_ATTRIBUTE :
288300 release . Name = reader . Value ;
289301 break ;
290- case nameof ( Release . Kind ) :
302+ case KIND_ATTRIBUTE :
291303 release . Kind = Common . Convert . ConvertValue < ReleaseKind > ( reader . Value ) ;
292304 break ;
293- case nameof ( Release . Title ) :
305+ case TITLE_ATTRIBUTE :
294306 release . Title = reader . Value ;
295307 break ;
296- case nameof ( Release . Edition ) :
308+ case EDITION_ATTRIBUTE :
297309 release . Edition = reader . Value ;
298310 break ;
299- case nameof ( Release . Version ) :
300- release . Version = Version . Parse ( reader . Value ) ;
311+ case VERSION_ATTRIBUTE :
312+ release . Version = Version . TryParse ( reader . Value , out var version ) ? version : null ;
301313 break ;
302- case nameof ( Release . Size ) :
303- release . Size = uint . Parse ( reader . Value ) ;
314+ case SIZE_ATTRIBUTE :
315+ release . Size = uint . TryParse ( reader . Value , out var size ) ? size : 0 ;
304316 break ;
305- case nameof ( Release . Path ) :
317+ case PATH_ATTRIBUTE :
306318 release . Path = reader . Value ;
307319 break ;
308- case nameof ( Release . Checksum ) :
320+ case CHECKSUM_ATTRIBUTE :
309321 release . Checksum = Checksum . Parse ( reader . Value ) ;
310322 break ;
311- case nameof ( Release . Platform ) :
323+ case PLATFORM_ATTRIBUTE :
312324 release . Platform = Common . Convert . ConvertValue < Platform > ( reader . Value ) ;
313325 break ;
314- case nameof ( Release . Architecture ) :
326+ case ARCHITECTURE_ATTRIBUTE :
315327 release . Architecture = Common . Convert . ConvertValue < Architecture > ( reader . Value ) ;
316328 break ;
317- case nameof ( Release . Deprecated ) :
318- release . Deprecated = bool . Parse ( reader . Value ) ;
329+ case DEPRECATED_ATTRIBUTE :
330+ release . Deprecated = bool . TryParse ( reader . Value , out var deprecated ) && deprecated ;
319331 break ;
320- case nameof ( Release . Creation ) :
321- release . Creation = DateTime . Parse ( reader . Value ) ;
332+ case CREATION_ATTRIBUTE :
333+ release . Creation = DateTime . TryParse ( reader . Value , out var creation ) ? creation : default ;
322334 break ;
323335 }
324336 }
337+
338+ if ( reader . NodeType == XmlNodeType . Attribute )
339+ reader . MoveToElement ( ) ;
325340 }
326341
327342 private static XmlReaderSettings GetSettings ( bool asynchronous ) => new ( )
0 commit comments