Reading in XML/KML files using C#

后端 未结 5 1371
遥遥无期
遥遥无期 2021-02-03 11:28

I\'m trying to import the kml xml Google earth file into an application, but i can\'t seem to get the xDocument syntax right in order to do what i want, i\'m wondering if anyone

相关标签:
5条回答
  • 2021-02-03 11:53

    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");
    
    0 讨论(0)
  • 2021-02-03 11:54
    var xDoc = XDocument.Load("a.xml");
    XNamespace ns = "http://earth.google.com/kml/2.2";
    
    var placemarks = xDoc.Descendants(ns+"Placemark")
                        .Select(p => new
                        {
                            Name = p.Element(ns+"name").Value,
                            Desc = p.Element(ns+"description").Value
                        })
                        .ToList();
    
    0 讨论(0)
  • 2021-02-03 11:59

    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.

    0 讨论(0)
  • 2021-02-03 12:04

    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;
        }
      }
    }
    
    0 讨论(0)
  • 2021-02-03 12:14

    Your kml file must contains

    <kml xmlns="http://www.opengis.net/kml/2.2" ...
    

    instead of

    <kml xmlns="http://earth.google.com/kml/2.2"> ...
    
    0 讨论(0)
提交回复
热议问题