Reading in XML/KML files using C# Reading in XML/KML files using C# xml xml

Reading in XML/KML files using C#


You didn't include any code, but I would guess that you forgot to include your namespace when referencing things. Here is an example.

Basic access:

var placemarks = xdoc.Element("kml").Element("Document").Elements("Placemark");

Using namespaces:

var ns = XNamespace.Get("http://earth.google.com/kml/2.2");var placemarks = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark");


My guess is that you've forgotten to use the namespace in your LINQ to XML queries. It's easy enough to extract the data from this:

XNamespace ns = "http://earth.google.com/kml/2.2";var doc = XDocument.Load("file.xml");var query = doc.Root               .Element(ns + "Document")               .Elements(ns + "Placemark")               .Select(x => new PlaceMark // I assume you've already got this                       {                           Name = x.Element(ns + "name").Value,                           Description = x.Element(ns + "description").Value,                           // etc                       });

If that doesn't help, please post a complete example of what you've tried, and what went wrong.


I used SharmpKml and its documentation to extract information from KML file.

using SharpKml.Dom;using SharpKml.Engine;using SharpKml.Dom.GX;TextReader reader = File.OpenText(filePath);KmlFile file = KmlFile.Load(reader);_kml = file.Root as Kml;sPlaceMarks[] tempPlaceMarks = new sPlaceMarks[1000];if (_kml != null){  foreach (var placemark in _kml.Flatten().OfType<Placemark>())  {  tempPlaceMarks[numOfPlaceMarks].Name = placemark.Name;  tempPlaceMarks[numOfPlaceMarks].Description = placemark.Description.Text;  tempPlaceMarks[numOfPlaceMarks].StyleUrl = placemark.StyleUrl;  tempPlaceMarks[numOfPlaceMarks].point = placemark.Geometry as SharpKml.Dom.Point;  tempPlaceMarks[numOfPlaceMarks].CoordinateX = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Longitude;  tempPlaceMarks[numOfPlaceMarks].CoordinateY = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Latitude;  tempPlaceMarks[numOfPlaceMarks].CoordinateZ = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Altitude;  numOfPlaceMarks++;  }  foreach (var lookAt in _kml.Flatten().OfType<LookAt>())  {  Placemark placemark = (Placemark)lookAt.Parent;  for (int i = 0; i < numOfPlaceMarks; i++)  {    if (placemark.Name == tempPlaceMarks[i].Name)    {      tempPlaceMarks[i].Name = placemark.Name;      tempPlaceMarks[i].Description = placemark.Description.Text;      tempPlaceMarks[i].StyleUrl = placemark.StyleUrl;      tempPlaceMarks[i].altitude = lookAt.Altitude;      tempPlaceMarks[i].AltitudeMode =(SharpKml.Dom.GX.AltitudeMode)lookAt.GXAltitudeMode;      tempPlaceMarks[i].Heading = lookAt.Heading;      tempPlaceMarks[i].Latitude = lookAt.Latitude;      tempPlaceMarks[i].Longitude = lookAt.Longitude;      tempPlaceMarks[i].Range = lookAt.Range;      tempPlaceMarks[i].Tilt = lookAt.Tilt;      break;    }  }}