簡體   English   中英

如何解析XML元素?

[英]How to parse XML elements?

我有一個包含此塊的XML文件。 我可以解析除速度和瓦特之外的所有內容。

這是XML字符串:

"<Trackpoint>" + 
"<Time>2014-05-06T23:22:40.000Z</Time>" + 
"<Position>" + 
"<LatitudeDegrees>34.43368820473552</LatitudeDegrees>" + 
"<LongitudeDegrees>-84.17464644648135</LongitudeDegrees>" + 
"</Position>" + 
"<AltitudeMeters>377.79998779296875</AltitudeMeters>" + 
"<DistanceMeters>337.4100036621094</DistanceMeters>" + 
"<HeartRateBpm>" + 
"<Value>152</Value>" + 
"</HeartRateBpm>" + 
"<Cadence>107</Cadence>" + 
"<Extensions>" + 
"<TPX xmlns=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2\">" + 
"<Speed>9.878000259399414</Speed>" + 
"<Watts>238</Watts>" +** 
"</TPX>" + 
"</Extensions>" + 
"</Trackpoint>" + 

這是我用來解析它的代碼:

select new TrackPointDTO {
                        Timex = trackPointElement.Element (ns1 + "Time") != null ? Convert.ToString ((string)trackPointElement.Element (ns1 + "Time").Value) : "",
                        AltitudeMeters = (decimal)(trackPointElement.Element (ns1 + "AltitudeMeters") != null ? Convert.ToDouble ((string)trackPointElement.Element (ns1 + "AltitudeMeters").Value) : 0.0),
                        DistanceMeters = (decimal)(trackPointElement.Element (ns1 + "DistanceMeters") != null ? Convert.ToDouble ((string)trackPointElement.Element (ns1 + "DistanceMeters").Value) : 0.0),
                        HeartRateBpm = trackPointElement.Element (ns1 + "HeartRateBpm") != null ? Convert.ToInt16 ((string)trackPointElement.Element (ns1 + "HeartRateBpm").Value) : 0,
                        Cadence = trackPointElement.Element (ns1 + "Cadence") != null ? Convert.ToInt16 ((string)trackPointElement.Element (ns1 + "Cadence").Value) : 0,

                                    SpeedPower = ((from speedPowerElement in trackPointElement.Descendants (ns1 + "Extensions").Descendants(ns1 + "TPX")
                                        select new SpeedPower {
                                            Speed = (double)Convert.ToDouble ((string)speedPowerElement.Element(ns1 + "Speed").Value),
                                            Power = (double)Convert.ToDouble ((string)speedPowerElement.Element (ns1 + "Watts").Value)
                                        })
                                        .ToList ()),


                        SensorState = trackPointElement.Element (ns1 + "SensorState") != null ? trackPointElement.Element (ns1 + "SensorState").Value : "",
                        Positionx = ((from positionElement in trackPointElement.Descendants (ns1 + "Position")
                            select new Position {
                            LatitudeDegrees = (double)Convert.ToDouble ((string)positionElement.Element (ns1 + "LatitudeDegrees").Value),
                            LongitudeDegrees = (double)Convert.ToDouble ((string)positionElement.Element (ns1 + "LongitudeDegrees").Value)
                        })
                            .ToList ())

我似乎無法以最快的速度和力量...有什么建議嗎?

TPX元素(及其同級元素)位於不同的名稱空間中。 因此,您需要初始化一個用於這些元素的附加XNamespace變量,而不是“ ns1”。

順便說一句,可以使用XElement上的顯式強制轉換操作結合“空合並運算符”來縮短此類行:

// This:
((string)trackPointElement.Element (ns1 + "Time").Value) : "",
(decimal)(trackPointElement.Element (ns1 + "AltitudeMeters") != null ? Convert.ToDouble ((string)trackPointElement.Element (ns1 + "AltitudeMeters").Value) : 0.0),

// is equivalent to:
(string)trackPointElement.Element (ns1 + "Time") ?? ""
(decimal?)trackPointElement.Element (ns1 + "AltitudeMeters") ?? 0.0,

您需要使用XNamespace.Get方法將名稱空間用於TPX節點。 可能的解決方案如下所示:

var doc = XDocument.Parse(xml);
// create namespace of TPX
var ns = XNamespace.Get(@"http://www.garmin.com/xmlschemas/ActivityExtension/v2");
// get TPX node using the namespace
var tpx = doc.Root.Element("Extensions").Element(ns + "TPX");
// retrieve Speed and Watts using the namespace
var speed = tpx.Element(ns + "Speed");
var watts = tpx.Element(ns + "Watts");
Console.WriteLine("{0} - {1}", speed.Value, watts.Value);

輸出為:

9.878000259399414 - 238

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM