[英]xpath: getting child node by searching parent attribute
我有一个要编辑的Google地图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
属性与“ At Large as District 1”相匹配。 在NPP的XML工具插件中,当我仅使用<ExtendedData>...</ExtendedData>
节点时,此查询返回我想要的节点: //Data[@name='At Large as District 1']
。 但是,当我在PHP中尝试相同的查询时:
$targetnode = $extendeddata->xpath("//Data[@name='At Large as District 1']")
我得到一个空数组。 我不明白为什么什么是完全有效的xpath查询不会返回任何信息。 我想念什么吗?
结束标记不匹配。
将</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
)
)
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.