解析多个命名空间

时间:2014-08-25 06:02:07

标签: c# .net linq-to-xml

我如何获得" HR"和" Cad"以下XML文件中的节点:

<?xml version="1.0" encoding="UTF-8"?>
<gpx 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" creator="StravaGPX" version="1.1" 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">
   <metadata>
      <time>2011-07-16T13:39:22Z</time>
   </metadata>
   <trk>
      <name>07/16/2011 Toronto, ON, Canada</name>
      <trkseg>
         <trkpt lat="43.7076220" lon="-79.3164530">
            <ele>138.4</ele>
            <time>2011-07-16T13:39:22Z</time>
            <extensions>
               <gpxtpx:TrackPointExtension>
                  <gpxtpx:hr>124</gpxtpx:hr>
                  <gpxtpx:cad>90</gpxtpx:cad>
               </gpxtpx:TrackPointExtension>
            </extensions>
         </trkpt>
      </trkseg>
   </trk>
</gpx>

我可以使用以下代码解析该元素:

loaded.Descendants("{http://www.topografix.com/GPX/1/1}trkpt") // Where 'loaded' is the XDocument

但是当我查看调试器中的元素时,它只向我显示<ele><time>元素,并忽略作为后代的<TrackPointExtension><extension>元素。 / p> 提前谢谢!

1 个答案:

答案 0 :(得分:1)

如何使用调试器进行检查并不是很清楚,但据我所知,调试器不应忽略所选节点的后代。

要从具有多个名称空间前缀的XML中选择元素,您只需要为右元素使用右XNamespace前缀,例如:

XNamespace ns = "http://www.topografix.com/GPX/1/1";
XNamespace gpx = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1";
var trackPointExt = doc.Root
                       .Element(ns+"trk")
                       .Element(ns+"trkseg")
                       .Element(ns+"trkpt")
                       .Element(ns+"extensions")
                       .Element(gpx+"TrackPointExtension");
var hr = (int)trackPointExt.Element(gpx+"hr");
var cad = (int)trackPointExt.Element(gpx+"cad");
Console.WriteLine(hr);
Console.WriteLine(cad);