private string BuildGpx(TopoTrailInfo trail)
        {
            var writer = new GpxFileWriter();

            // write file header
            writer.SetVersion(GpxSchemaVersion.Version1_1);
            writer.WriteHeader(trail);

            // write custom data
            var data = new GpxExtensionData()
            {
                Timezone = trail.Timezone.TZID,
                Country  = (trail.Country?.Name ?? ""),
                Region   = (trail.Region?.RegionName ?? ""),
                Location = trail.Location
            };

            writer.WriteMetadata(data);

            // write tracks
            foreach (var track in trail.TopoTracks)
            {
                writer.WriteTrack(track);
            }

            return(writer.GetXml());
        }
        public void WriteMetadata(GpxExtensionData data)
        {
            var extensions = _xml.CreateElement("extensions");

            _root.AppendChild(extensions);

            var timezoneNode = _xml.CreateElement("timezone");

            extensions.AppendChild(timezoneNode);
            timezoneNode.InnerText = data.Timezone;

            var countryNode = _xml.CreateElement("country");

            extensions.AppendChild(countryNode);
            countryNode.InnerText = data.Country;

            if (!String.IsNullOrWhiteSpace(data.Region))
            {
                var regionNode = _xml.CreateElement("region");
                extensions.AppendChild(regionNode);
                regionNode.InnerText = data.Region;
            }

            if (!String.IsNullOrWhiteSpace(data.Location))
            {
                var locationNode = _xml.CreateElement("location");
                extensions.AppendChild(locationNode);
                locationNode.InnerText = data.Location;
            }
        }
        /// <summary>
        /// Extracts additional custom data if exists
        /// </summary>
        public GpxExtensionData ReadExtension()
        {
            var data = new GpxExtensionData();

            data.Timezone = ReadExtension("timezone");
            data.Country  = ReadExtension("country");
            data.Region   = ReadExtension("region");
            data.Location = ReadExtension("location");
            return(data);
        }