2017-03-05 75 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,這個伎倆! –