从 WPF c# 中读取 XML

Reading in XML from WPF c#

我正在努力将 "GPX" 文件读入 WPF (c#) 项目。下面提供了示例 GPX。我尝试了很多不同的选项,但结果相同。

文档加载正常,但我无法将其分解以直接访问节点。

如有任何帮助,我们将不胜感激。

谢谢。

private void Simple_Click(object sender, RoutedEventArgs e)
{
  XmlDocument xml = new XmlDocument();
  xml.Load(@"C:\Users\Jonathon\Desktop\GPX_Data.gpx");
  XmlNodeList nodes = xml.SelectNodes("trkpt"); // have tried: double '/' to get nodes at any level (XPath syntax)        
  //XmlNodeList nodes = xml.SelectNodes("/gpx/trk/trkseg/trkpt");

  int count = 0;

  foreach (XmlNode xn in nodes)
  {
     count++;
     }

  }
}

示例 GPX 文件

<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Endomondo.com"  
     xsi:schemaLocation="http://www.topografix.com/GPX/1/1 
        http://www.topografix.com/GPX/1/1/gpx.xsd 
        http://www.garmin.com/xmlschemas/GpxExtensions/v3 
        http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd 
        http://www.garmin.com/xmlschemas/TrackPointExtension/v1 
        http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" 
    xmlns="http://www.topografix.com/GPX/1/1" 
    xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" 
    xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <metadata>
    <author>
      <name>Jonathon Ralfe</name>
      <email id="jonathon" domain="ralfe.net"/>
    </author>
    <link href="http://www.endomondo.com">
      <text>Endomondo</text>
</link>
<time>2015-01-27T18:31:26Z</time>
  </metadata>
  <trk>
    <src>http://www.endomondo.com/</src>
    <link href="https://www.endomondo.com/workouts/463986953/2256850">
      <text>endomondo</text>
    </link>
    <type>SKIING_DOWNHILL</type>
    <trkseg>
      <trkpt lat="45.576892" lon="6.894079">
        <time>2015-01-26T09:49:57Z</time>
      </trkpt>
      <trkpt lat="45.576892" lon="6.894079">
        <ele>1595.0</ele>
        <time>2015-01-26T09:49:59Z</time>
      </trkpt>
      <trkpt lat="45.577109" lon="6.893946">
        <ele>1581.0</ele>
        <time>2015-01-26T09:51:46Z</time>
      </trkpt>
      <trkpt lat="45.5772" lon="6.894084">
        <ele>1575.0</ele>
        <time>2015-01-26T09:52:02Z</time>
      </trkpt>
      <trkpt lat="45.577247" lon="6.894212">
        <ele>1577.0</ele>
        <time>2015-01-26T09:52:05Z</time>
      </trkpt>
      <trkpt lat="45.577317" lon="6.89452">
        <ele>1589.0</ele>
        <time>2015-01-26T09:52:11Z</time>
      </trkpt>

那是因为你的xml有命名空间,所以查询数据的时候要设置命名空间。

考虑这种方法:

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

这里我们正在创建 NamespaceManager,根据您的数据 xmlns="http://www.topografix.com/GPX/1/1" 属性设置命名空间,并在 XPath 中使用此命名空间。

通过 XPath 选择:

foreach(XElement aElement in xml.XPathSelectElements("/trk/trkseg").Elements())
{

      foreach(XNode aXNode in aElement.Nodes())
      {
         //Access subnodes of trkpt
      }
}