2017-03-05 80 views
1

我正在尝试读取GPX文件(位置数据的一种XML文件)。这是结构:使用XmlDocument读取GPX文件

<?xml version="1.0"?> 
<gpx creator="GPX-service" version="1.1" 
xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 
http://www.topografix.com/GPX/1/1/gpx.xsd"> 
<trk> 
<name>Route</name> 
<trkseg> 
<trkpt lat="51.966738" lon="6.501578"> 
</trkpt> 
<trkpt lat="51.966689" lon="6.501456"> 
</trkpt> 
</trkseg> 
</trk> 
</gpx> 

我以前参加了超过一百个XML文件,但这一个不起作用。我读了GPX文件中这样说:

XmlDocument gpxDoc = new XmlDocument(); 
gpxDoc.Load(gpxfile); 

XmlNodeList nl = gpxDoc.SelectNodes("trkpt"); 

foreach (XmlNode xnode in nl) 
{ 
    string name = xnode.Name; 

} 

变量“gpxfile”是路径gpxfile,这是正确的(测试)。

+0

什么不工作? –

+0

我讨厌'System.xml'!并且始终使用“System.Xml.Linq”,它更简单,更全面。如果你想'Xml.Linq'我可以给你一个解决方案。 –

回答

2

您需要使用命名空间。元素trkpt在当前上下文中不存在,仅在命名空间http://www.topografix.com/GPX/1/1中存在。下面是一个例子,说明如何使用上述命名空间 - let x是URI的别名。

XmlNamespaceManager nsmgr = new XmlNamespaceManager(gpxDoc.NameTable); 
nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1");    
XmlNodeList nl = gpxDoc.SelectNodes("//x:trkpt", nsmgr); 

需要注意的是,我们现在在x命名空间选择(例如的替代//x:trkpt//trkpt)节点。

+0

谢谢@ redlynx82,这个伎俩! –