Search code examples
phpxmlparsingkmldomdocument

How to get specific tag in KML file using php DOMDocument?


I have a .kml file shaped like this :

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
    <name>myFile.shp</name>
    <Style id="style1">
        <PolyStyle>
            <color>ff00ff00</color>
        </PolyStyle>
    </Style>
    <Folder id="layer 0">
        <name>background</name>
        <Placemark>
            <styleUrl>#style1</styleUrl>
            <LineString>
                <coordinates>
                    -2.94040373,54.83409343483 -2.943834733,54.893839393
                </coordinates>
            </LineString>
        </Placemark>
      </Folder>
</Document>
</kml>

Question

How can I get this file as a DOMDocument, and get ALL tag element with name "coordinates" ?

The goal is to be able to get the coordinates, even if the file shape change, like for example :

<kml xmlns="http://earth.google.com/kml/2.0">
  <Folder>
    <name>OpenLayers export</name>
    <description>No description available</description>
    <Placemark>
      <name>OpenLayers.Feature.Vector_7341</name>
      <description>No description available</description>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>
              -2.94040373,54.83409343483 -2.943834733,54.893839393
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
  </Folder>
</kml>

My attempts was to loop through the document using simplexml_load_file() but unfortunately I would not be reliable as the "tag order" change between those 2 documents, and I do not know why it does not follow a single pattern (which lead me to ask this question because it may have more than 2 shape for a KML ? correct me if I am wrong).


Solution

  • Use DOMDocument class to parse XML. Then use getElementsByTagName() to get all coordinates elements.

    $dom = new DOMDocument();
    // load file 
    $dom->load("file.kml");
    // get coordinates tag
    $coordinates = $dom->getElementsByTagName("coordinates");
    foreach($coordinates as $coordinate){
        echo $coordinate->nodeValue;
    }