I'm Delphi newbie trying to create a GPX file like this,
<?xml version="1.0" encoding="UTF-8" ?>
- <gpx xmlns="http://www..." version="1.1" creator="EasyGPS 4.18" xmlns:xsi="http://www..." " xsi:schemaLocation="http://www..." >
- <metadata>
<bounds minlat="19.38975200" minlon="-99.17971000" maxlat="19.39671900" maxlon="-99.17543500" />
- <extensions>
<time xmlns="http://www...">2011-02-20T01:51:38.662Z</time>
</extensions>
</metadata>
- <wpt lat="19.39671900" lon="-99.17820800">
<time>2011-02-20T01:44:26.284Z</time>
<name>INDIANAPOLIS</name>
<sym>Residence</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." >
<label_text>INDIANAPOLIS</label_text>
</label>
</extensions>
</wpt>
- <wpt lat="19.38975200" lon="-99.17543500">
<time>2011-02-20T01:44:26.284Z</time>
<name>SUPERAMA</name>
<sym>Department Store</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." ">
<label_text>SUPERAMA</label_text>
</label>
</extensions>
</wpt>
- <wpt lat="19.39119400" lon="-99.17971000">
<time>2011-02-20T01:44:26.284Z</time>
<name>CUMULUS1</name>
<sym>Waypoint</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." ">
<label_text>CUMULUS1</label_text>
</label>
</extensions>
</wpt>
- <rte>
- <extensions>
<label xmlns="http://www..." />
</extensions>
- <rtept lat="19.39671900" lon="-99.17820800">
<time>2011-02-20T01:44:26.284Z</time>
<name>INDIANAPOLIS</name>
<sym>Residence</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." >
<label_text>INDIANAPOLIS</label_text>
</label>
</extensions>
</rtept>
- <rtept lat="19.38975200" lon="-99.17543500">
<time>2011-02-20T01:44:26.284Z</time>
<name>SUPERAMA</name>
<sym>Department Store</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www.topografix.com/GPX/gpx_overlay/0/3">
<label_text>SUPERAMA</label_text>
</label>
</extensions>
</rtept>
- <rtept lat="19.39119400" lon="-99.17971000">
<time>2011-02-20T01:44:26.284Z</time>
<name>CUMULUS1</name>
<sym>Waypoint</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." >
<label_text>CUMULUS1</label_text>
</label>
</extensions>
</rtept>
- <rtept lat="19.39671900" lon="-99.17820800">
<time>2011-02-20T01:44:26.284Z</time>
<name>INDIANAPOLIS</name>
<sym>Residence</sym>
- <extensions>
<time xmlns="http://www..." </time>
- <label xmlns="http://www..." >
<label_text>INDIANAPOLIS</label_text>
</label>
</extensions>
</rtept>
</rte>
<extensions />
</gpx>
I have the following code
// root
iXml := XmlDoc.DOMDocument;
xmlNode := iXml.appendChild (iXml.createElement ('xml'));
iAttribute := iXml.createAttribute ('version');
iAttribute.nodeValue := '1.0';
xmlNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('encoding');
iAttribute.nodeValue := 'UTF-8';
xmlNode.attributes.setNamedItem (iAttribute);
//GPX
gpxNode := xmlNode.appendChild(iXml.createElement ('gpx'));
iAttribute := iXml.createAttribute ('xmlns');
iAttribute.nodeValue := http://www... ;
gpxNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('version');
iAttribute.nodeValue := '1.1';
gpxNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('creator');
iAttribute.nodeValue := http://www..." ;
gpxNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('xmlns:xsi');
iAttribute.nodeValue := 'http://www.w3.org/2001/XMLSchema-instance';
gpxNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('xsi:schemaLocation');
iAttribute.nodeValue := http://www..." ';
gpxNode.attributes.setNamedItem (iAttribute);
mNode := gpxNode.appendChild(iXml.createElement ('metadata'));
bNode := mNode.appendChild(iXml.createElement ('bounds'));
iAttribute := iXml.createAttribute ('minlat');
iAttribute.nodeValue := '19.38975200';
bNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('minlon');
iAttribute.nodeValue := '-99.17971000';
bNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('maxlat');
iAttribute.nodeValue := '19.39671900';
bNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('maxlon');
iAttribute.nodeValue := '-99.17543500';
bNode.attributes.setNamedItem (iAttribute);
trksegNode := gpxNode.appendChild(iXml.createElement ('wpt'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.39671900';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17820800';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'INDIANAPOLIS';
trksegNode.attributes.setNamedItem (iAttribute);
trksegNode := gpxNode.appendChild(iXml.createElement ('wpt'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.38975200';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17543500';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'SUPERAMA';
trksegNode.attributes.setNamedItem (iAttribute);
trksegNode := gpxNode.appendChild(iXml.createElement ('wpt'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.39119400';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17971000';
trksegNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'CUMULUS1';
trksegNode.attributes.setNamedItem (iAttribute);
trkptNode := gpxNode.appendChild (iXml.createElement ('rte'));
trkNode := trkptNode.appendChild (iXml.createElement ('rtept'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.39671900';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17820800';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'INDIANAPOLIS';
trkNode.attributes.setNamedItem (iAttribute);
trkNode := trkptNode.appendChild (iXml.createElement ('rtept'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.38975200';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17543500';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'SUPERAMA';
trkNode.attributes.setNamedItem (iAttribute);
trkNode := trkptNode.appendChild (iXml.createElement ('rtept'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.39119400';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17971000';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'CUMULUS1';
trkNode.attributes.setNamedItem (iAttribute);
trkNode := trkptNode.appendChild (iXml.createElement ('rtept'));
iAttribute := iXml.createAttribute ('lat');
iAttribute.nodeValue := '19.39671900';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('lon');
iAttribute.nodeValue := '-99.17820800';
trkNode.attributes.setNamedItem (iAttribute);
iAttribute := iXml.createAttribute ('name');
iAttribute.nodeValue := 'INDIANAPOLIS';
trkNode.attributes.setNamedItem (iAttribute);
But when I try to validate my GPX file it doesn't validates, "it is not a GPX file"
I think my main problem is on the first rows where I declare the GPX node, I am almost desperate, any help will be really appreciated
Here is the file that I get with the code:
<xml version="1.0">
<gpx xmlns="http://www.." version="1.1" creator="http://www..." xmlns:xsi="http://www..." " xsi:schemaLocation="htthttp://www..." >
<metadata xmlns="">
<bounds minlat="19.38975200" minlon="-99.17971000" maxlat="19.39671900" maxlon="-99.17543500"/>
</metadata>
<wpt xmlns="" lat="19.39671900" lon="-99.17820800" name="INDIANAPOLIS"/>
<wpt xmlns="" lat="19.38975200" lon="-99.17543500" name="SUPERAMA"/>
<wpt xmlns="" lat="19.39119400" lon="-99.17971000" name="CUMULUS1"/>
<rte xmlns="">
<rtept lat="19.39671900" lon="-99.17820800" name="INDIANAPOLIS"/>
<rtept lat="19.38975200" lon="-99.17543500" name="SUPERAMA"/>
<rtept lat="19.39119400" lon="-99.17971000" name="CUMULUS1"/>
<rtept lat="19.39671900" lon="-99.17820800" name="INDIANAPOLIS"/>
</rte>
</gpx>
</xml>
Thanks in advance for your help
As far as I can tell from the example source, the XML namespace attribute
should not be there.
The document element in the original file uses the
xmlns="http://www..."
namespace. Its child elements inherit this namespace. But by adding thexmlns=""
in Delphi, the child elements have a different ('default') namespaces. which will cause the XML to be invalid (you can try with a XML validator).You need to tell the Delphi DOM that the root element has the given namespace.
Do not (never ever) use
Instead, assign a namespace to the document and add elements with the special DOM methods which have an additional namespace parameter.
Try to import the GPX XSD in your Delphi using the Delphi XML Data Binding Wizard as this answer suggests.
It generates a unit with interfaces and classes wrapping around the GPX structure.
Then go from there.
You could take a look at how GPX Editor does the trick. It's open source and a Delphi application..
In the lib\ folder you'll find files that might be of interest for you.