@@ -379,6 +379,39 @@ class GpxReader {
379379 return string;
380380 }
381381
382+ Object ? _readMap (Iterator <XmlEvent > iterator, String tagName) {
383+ final elm = iterator.current;
384+ if (! (elm is XmlStartElementEvent &&
385+ elm.name == tagName &&
386+ ! elm.isSelfClosing)) {
387+ return null ;
388+ }
389+
390+ final valueMap = < String , Object > {};
391+ String ? valueText;
392+ while (iterator.moveNext ()) {
393+ final val = iterator.current;
394+
395+ if (val is XmlStartElementEvent ) {
396+ valueMap[val.name] = _readMap (iterator, val.name) ?? {};
397+ }
398+
399+ if (val is XmlTextEvent ) {
400+ valueText = val.value;
401+ }
402+
403+ if (val is XmlCDATAEvent ) {
404+ valueText = val.value;
405+ }
406+
407+ if (val is XmlEndElementEvent && val.name == tagName) {
408+ break ;
409+ }
410+ }
411+
412+ return valueMap.isNotEmpty ? valueMap : valueText;
413+ }
414+
382415 Trkseg _readSegment (Iterator <XmlEvent > iterator) {
383416 final trkseg = Trkseg ();
384417 final elm = iterator.current;
@@ -407,31 +440,9 @@ class GpxReader {
407440 return trkseg;
408441 }
409442
410- Map <String , String > _readExtensions (Iterator <XmlEvent > iterator) {
411- final exts = < String , String > {};
412- final elm = iterator.current;
413-
414- /*if (elm is XmlStartElementEvent) {
415- link.href = elm.attributes
416- .firstWhere((attr) => attr.name == GpxTagV11.href)
417- .value;
418- }*/
419-
420- if ((elm is XmlStartElementEvent ) && ! elm.isSelfClosing) {
421- while (iterator.moveNext ()) {
422- final val = iterator.current;
423-
424- if (val is XmlStartElementEvent ) {
425- exts[val.name] = _readString (iterator, val.name) ?? '' ;
426- }
427-
428- if (val is XmlEndElementEvent && val.name == GpxTagV11 .extensions) {
429- break ;
430- }
431- }
432- }
433-
434- return exts;
443+ Map <String , Object > _readExtensions (Iterator <XmlEvent > iterator) {
444+ final exts = _readMap (iterator, GpxTagV11 .extensions) ?? {};
445+ return (exts is Map <String , Object >) ? exts : {};
435446 }
436447
437448 Link _readLink (Iterator <XmlEvent > iterator) {
0 commit comments