C# 从wpfc读取XML

C# 从wpfc读取XML,c#,xml,gpx,C#,Xml,Gpx,我正在努力将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"); Xml

我正在努力将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);
在这里,我们根据您的数据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
      }
}

您可能需要为对象trkseg选择节点,并使用它的childrenGreat,谢谢Andy,这正是我所需要的。但是,您能否建议一种从XML动态提取名称空间的方法,这样我就不必使用静态文本对其进行编码?谢谢。@JonathonRalfe,你可以像xml.DocumentElement.namespaceurify一样获得这个名称空间,谢谢JohnnyQ,但是你的代码没有为我编译。