0

編集したい 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;
}

属性が「At Large as District 1」に一致する<Data>ノードを取得する必要があります。nameNPP の XML ツール プラグインで、<ExtendedData>...</ExtendedData>ノードだけを取得すると、このクエリは必要なノードを返します: //Data[@name='At Large as District 1']. ただし、PHP で同じクエリを実行すると、次のようになります。

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

空の配列を取得します。完全に有効な xpath クエリが情報を返さない理由がわかりません。何か不足していますか?

4

1 に答える 1

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
        )

)

お役に立てれば。

于 2013-07-29T17:47:42.107 に答える