2016-07-20 23 views
0

Ich habe eine XML-Datei, die eine Reihe von Elementen, wie die folgenden enthalten:Wie erhalte ich den Wert eines Nachkommenelements?

<trkpt lat="42.403128" lon="-71.084654"> 
    <ele>12.153809</ele> 
    <time>2002-03-11T20:49:26Z</time> 
    <sym>Waypoint</sym> 
</trkpt> 

Ich verwende den folgenden Code, um die lat und lon Attribute zu greifen und sie zu einer Liste hinzuzufügen:

XDocument doc = XDocument.Load(filename); 

XElement trkseg = doc.Descendants().Where(x => x.Name.LocalName == "trkseg").FirstOrDefault(); 
XNamespace ns = trkseg.Name.Namespace; 

var l_l = trkseg.Elements(ns + "trkpt").Select(x => new 
{ 
    lat = x.Attribute("lat").Value, 
    lon = x.Attribute("lon").Value 
}).ToList(); 

Der obige Code funktioniert wie erwartet. Ich erhalte eine Liste von Strings mit den Werten lat und lon. Bis jetzt sind wir gut.

Das Problem tritt auf, wenn ich versuche, den Wert des <time> Elements zu erhalten. Ich habe mehrere verschiedene Varianten des folgenden versucht, ohne Erfolg:

lat = x.Attribute("lat").Value, 
lon = x.Attribute("lon").Value, 
time = x.Descendants("time").Elements().FirstOrDefault().Value 

Alle meine Versuche resultierten in timenull zu sein. Wie bekomme ich den Wert des Elements <time>?

Antwort

0

Geht man von ns Wesen verwendet, um auf trkpt Element zuzugreifen, obwohl das Element kein Namespace-Präfix hat, dann glaube ich, dass Ihr XML Standard-Namespace irgendwo über trkpt Element-Ebene hat. In diesem Fall erbt time Element den gleichen Namensraum wie trkpt, so dass Sie vielleicht einfach die XNamespace fehlen:

time = x.Element(ns+"time").Value 
0

Nicht sicher, ob dies würde für Ihre gesamte Lösung arbeiten, aber auf dem, was Sie zur Verfügung gestellt, ich war in der Lage, dies zu erhalten zu arbeiten:

XDocument doc = XDocument.Load("XMLFile1.xml"); 

XElement trkseg = doc.Descendants().Where(x => x.Name.LocalName == "trkseg").FirstOrDefault(); 
XNamespace ns = trkseg.Name.Namespace; 

var l_l = trkseg.Elements(ns + "trkpt").Select(x => new 
{ 
    lat = x.Attribute("lat").Value, 
    lon = x.Attribute("lon").Value, 
    time = x.Element("time").Value 
}).ToList(); 

Es ist leicht zu über komplizieren XML (ich sage, dass aus eigener Erfahrung); in diesem Fall sieht es aus wie Sie weiter zu graben wurden, als Sie benötigt, wenn Sie in einer Ebene des xml schon waren Sie in sein musste

Hier ist der Ausgang ich habe.

{ lat = "42.403128", lon = "-71.084654", time = "2002-03-11T20:49:26Z" } 
+0

Dank! Ich fügte 'time = x.Element (" time ") hinzu. Wert 'zu meinem Code, aber' time 'ist immer noch' null '. – DenaliHardtail