#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. Протестировано с моими обоими файлами с разной структурой, теперь я могу рекурсивно получить все теги «координат».