xpath:通过搜索父属性获取子节点

时间:2013-07-29 17:32:04

标签: php xml xpath

我有一个我要编辑的谷歌地图的KML文件。这是一个精简版:

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'>
    <Document>
        <Placemark>
            <name>00</name>
            <snippet></snippet>
            <description><![CDATA[]]></description>
            <styleUrl>#Style0-polygon-3-map</styleUrl>
            <ExtendedData>
                <Data name='Two-Digit Districts'>
                    <value>AK-00</value>
                </Data>
                <Data name='Standard Districts'>
                    <value>AK-AL</value>
                </Data>
                <Data name='At Large as District 1'>
                    <value>AK-1</value>
                </Data>
                <Data name='Full District Name'>
                    <value>Alaska At Large</value>
                </Data>
                <Data name=''>
                    <value>AK</value>
                </Data>
            </ExtendedData>
        </PlaceMark>
    </Document>
</kml>

在我的PHP代码中,我正在使用SimpleXML挖掘每个地标节点:

foreach ($kml->Document->Placemark as $placemark) {
    $extendeddata = $placemark->ExtendedData;
}

我需要获取<Data>属性匹配的name节点“一般为第1区”。在NPP的XML工具插件中,当我只使用<ExtendedData>...</ExtendedData>节点时,此查询返回我想要的节点://Data[@name='At Large as District 1']。但是,当我在PHP中尝试相同的查询时:

$targetnode = $extendeddata->xpath("//Data[@name='At Large as District 1']")

我得到一个空数组。我不明白为什么一个完全有效的xpath查询应该不返回任何信息。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

结尾标记不匹配。

</PlaceMark>替换为</Placemark>

代码

在这种情况下,您必须注册命名空间才能执行xpath。

$extendeddata = simplexml_load_string( $str );
$extendeddata->registerXPathNamespace( 'ns', 'http://www.opengis.net/kml/2.2' );
$targetnode = $extendeddata->xpath("//ns:Data[@name='At Large as District 1']");

输出

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [name] => At Large as District 1
                )

            [value] => AK-1
        )

)

希望这有帮助。