问题
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
回答1:
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.
回答2:
As far as I can tell from the example source, the XML namespace attribute
xmlns=""
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 the xmlns=""
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
iAttribute := iXml.createAttribute ('xmlns');
Instead, assign a namespace to the document and add elements with the special DOM methods which have an additional namespace parameter.
回答3:
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.
来源:https://stackoverflow.com/questions/5197716/help-to-create-gpx-file-with-delphi-7