[英]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.