Как получить определенный тег в файле KML с помощью php DOMDocument?

#php #xml #parsing #kml #domdocument

#php #xml #синтаксический анализ #kml #domdocument

Вопрос:

У меня есть файл .kml, имеющий такую форму :

 <?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>
  

Вопрос

Как я могу получить этот файл как DOMDocument , и получить ВСЕ элементы тега с именем «координаты»?

Цель состоит в том, чтобы иметь возможность получать координаты, даже если форма файла изменяется, например :

 <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>
  

Мои попытки состояли в том, чтобы перебирать документ, используя simplexml_load_file() , но, к сожалению, я не был бы надежным, поскольку «порядок тегов» меняется между этими 2 документами, и я не знаю, почему он не следует одному шаблону (что заставляет меня задать этот вопрос, потому что он может иметь более 2 фигур для KML? поправьте меня, если я ошибаюсь).

Комментарии:

1. Почему вы не используете регулярные выражения? Таким образом, вам не нужно полагаться на порядок элементов.

2. Звучит умная идея, нужно попробовать, я дам вам знать.

3. Решение с регулярным выражением тоже работало, но я предпочитаю, чтобы анализатор разбил мой файл на теги и перемещался по ним, а не был открыт для проблемы с регулярным выражением. В любом случае спасибо @Dez за ваш вклад.

Ответ №1:

Используйте DOMDocument класс для анализа XML. Затем используйте getElementsByTagName() для получения всех coordinates элементов.

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

Комментарии:

1. Протестировано с моими обоими файлами с разной структурой, теперь я могу рекурсивно получить все теги «координат».