从KML文件中解析一些元素的问题

时间:2011-04-13 15:05:55

标签: php parsing xpath kml

我遇到了一个问题,即尝试使用PHP从我生成的KML文件中解析出一些数据,然后发送到我的网络服务器。我想要获取元素,并将它们存储到数据库中。存储它们不是问题,只是将一些元素排除在外。

以下是我尝试解析的KML文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>RandomName</name>
        <description>-</description>
        <Style id="line">
            <LineStyle>
            <color>CD0000FF</color>
            <width>4</width>
            </LineStyle>
        </Style>
        <ExtendedData>
            <Data name="StartTime">
                <value>1302653118875</value>
            </Data>
            <Data name="EndTime">
                <value>1302653159274</value>
            </Data>
            <Data name="Type">
                <value>cycle</value>
            </Data>
        </ExtendedData>

    <Placemark>
        <name>PlaceName2</name>
        <description><p>Current Altitude: <b>0.0 ft</b><br/>Current Speed: <b>0.0 m/s</b><br/>Total Distance: <b>0.608 km</b></p></description>
        <styleUrl>#line</styleUrl>
        <LineString>
            <extrude>1</extrude>
            <tessellate>1</tessellate>
            <coordinates>
            -122.083393,37.427768,0.0
            -122.084395,37.427768,0.0
            </coordinates>
        </LineString>
    </Placemark>
</Document>
</kml>

我正在使用以下代码,我能够得到第一个名称和描述。

function getTrackDescription($file){
    $xml = simplexml_load_file($file);
    $namespace = $xml->getDocNamespaces();

    if(isset($namespace[""])){
        $xml->registerXPathNamespace("default",$namespace[""]);
    }

    $element= $xml->xpath('//default:description');
    return $element[0];
}

我能够获得这些元素但是当我试图获得其他任何东西时,我什么也得不到。我需要能够访问ExtendedData中的值 - StartTime,EndTime和Type。我还需要从地标中获取描述。

我在尝试获取StartTime时从上面的代码中更改了1行,但它不起作用。

$element= $xml->xpath('//default:ExtendedData/Data[name="StartTime"]/value');

如果有人可以帮助我,或者指出我正确的方向,我会非常精彩,因为我还没有真正使用过XML。

谢谢。

1 个答案:

答案 0 :(得分:0)

由于您已为命名空间“http://www.opengis.net/kml/2.2”定义了前缀,因此必须确保将其用于属于该命名空间的所有元素。在上面的代码中,您实际上是在寻找带有ExtendedData前缀的default,但在没有前缀的命名空间中寻找Data

以下是您的选择:

$xml = simplexml_load_file($file);
var_dump($xml->xpath("//ExtendedData/Data[@name='StartTime']/value"));

$xml = simplexml_load_file($file);
$xml->registerXPathNamespace("default","http://www.opengis.net/kml/2.2");
var_dump($xml->xpath("//default:ExtendedData/default:Data[@name='StartTime']/default:value"));

两者都应该返回您希望的项目。