在 KML 文件中搜索和替换值

Search for and replace values in a KML file

我是 php 的新手,请放轻松。

我正在尝试在 KML 文件中搜索纬度和经度值,然后将它们替换为用户输入的 lat/long 值。我遇到的问题实际上是搜索 KML 文件以查找要替换的特定 lat/long 值。

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">
<Folder>
    <name>Folder-Name</name>
    <open>1</open>
    <gx:Tour>
        <name class="name">Tour-Name</name>
        <gx:Playlist>
            <gx:FlyTo>
                <LookAt>
                    <gx:horizFov>100</gx:horizFov>
                    <longitude class="lookat-long">33.33333</longitude>
                    <latitude class="lookat-lat">-111.11111</latitude>
                    <altitude>0</altitude>
                    <heading>0</heading>
                    <tilt>60</tilt>
                    <range>100</range>
                    <altitudeMode>relativeToGround</altitudeMode>
                </LookAt>
            </gx:FlyTo>
        </gx:Playlist>
    </gx:Tour>
</Folder>
</kml>

我需要用用户输入的值替换“33.33333”和“-111.11111”。我曾尝试使用 SimpleXML,但它无法识别标签的 gx: 部分,因为这是特定于 KML 的,而不是 XML 的一部分。所以当我尝试这段代码时:

<?php
    $xml = simplexml_load_file('my_kml_file');
    print_r($xml)
?>

我得到这个输出:

SimpleXMLElement Object ( [Folder] => SimpleXMLElement Object ( [name] => Temporary Places [open] => 0 ) )    

它只在 <open> 处停止,因为它无法识别其余部分。我花了好几个小时试图弄清楚如何最好地做到这一点,但我做不到。请帮忙。

您可以像这样使用 xpath 方法获取命名空间节点:

$xml = simplexml_load_file('my_kml_file');
$xml->xpath('//gx:Tour/gx:Playlist/gx:FlyTo')[0]->LookAt->longitude = 'newValue';
$xml->xpath('//gx:Tour/gx:Playlist/gx:FlyTo')[0]->LookAt->latitude = 'newValue';
print_r($xml->asXml());

输出:

<?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">
<Folder>
    <name>Folder-Name</name>
    <open>1</open>
    <gx:Tour>
        <name class="name">Tour-Name</name>
        <gx:Playlist>
            <gx:FlyTo>
                <LookAt>
                    <gx:horizFov>100</gx:horizFov>
                    <longitude class="lookat-long">newValue</longitude>
                    <latitude class="lookat-lat">newValue</latitude>
                    <altitude>0</altitude>
                    <heading>0</heading>
                    <tilt>60</tilt>
                    <range>100</range>
                    <altitudeMode>relativeToGround</altitudeMode>
                </LookAt>
            </gx:FlyTo>
        </gx:Playlist>
    </gx:Tour>
</Folder>
</kml>