Разбор канала KML с четырьмя квадратами с помощью simpleXML

Я пытаюсь проанализировать фид мест встречи KML из foursqare с simpleXML, но не могу получить URL-адрес вложенного места в описании. Похоже, что SimpleXML удаляет его.

В деталях:

Подача foursqare kml выглядит следующим образом:

<kml>
 <Folder>
    <name>foursquare checkin history for X</name>
    <description>foursquare checkin history for X</description>
    <Placemark>
       <name>somevenuename</name>
       <description>@<a href="/v/somevenueurl">somevenuename</a>- a foursqareshout!</description>
       <updated>Wed, 02 Nov 11 17:00:05 +0000</updated>
       <published>Wed, 02 Nov 11 17:00:05 +0000</published>
       <visibility>1</visibility>
       <Point>
         <extrude>1</extrude>
         <altitudeMode>relativeToGround</altitudeMode> 
         <coordinates>xx.xxxxxx,yy.yyyyyy</coordinates>
       </Point>
    </Placemark>
    etc ...  

Мой призыв к SimpleXMl... ну, просто:
$venue_items = simplexml_load_file($venue_kml_file);
Любые идеи, которые сохранить HTML в description?

1 ответ

Они правы. Это неверный XML. Тем не менее, я написал обходной путь для вас с помощью регулярных выражений. Это может быть немного хакерским, но вы можете сделать только из-за того, что вам дали, так что вот оно:

$xml_string = <<<XML_STRING
<kml>
 <Folder>
    <name>foursquare checkin history for X</name>
    <description>foursquare checkin history for X</description>
    <Placemark>
       <name>somevenuename</name>
       <description>@<a href="/v/somevenueurl">somevenuename</a>- a foursqareshout!</description>
       <updated>Wed, 02 Nov 11 17:00:05 +0000</updated>
       <published>Wed, 02 Nov 11 17:00:05 +0000</published>
       <visibility>1</visibility>
       <Point>
         <extrude>1</extrude>
         <altitudeMode>relativeToGround</altitudeMode> 
         <coordinates>xx.xxxxxx,yy.yyyyyy</coordinates>
       </Point>
    </Placemark>
 </Folder>
 <Folder>
    <name>foursquare checkin history for X</name>
    <description>foursquare checkin history for X</description>
    <Placemark>
       <name>somevenuename</name>
       <description>@<a href="/v/somevenueurl222">somevenuename</a>- a foursqareshout!</description>
       <updated>Wed, 02 Nov 11 17:00:05 +0000</updated>
       <published>Wed, 02 Nov 11 17:00:05 +0000</published>
       <visibility>1</visibility>
       <Point>
         <extrude>1</extrude>
         <altitudeMode>relativeToGround</altitudeMode> 
         <coordinates>xx.xxxxxx,yy.yyyyyy</coordinates>
       </Point>
    </Placemark>
 </Folder>
</kml>    

XML_STRING;


preg_match_all( '%<Placemark>(.*?)</Placemark>%s', $xml_string, $placemarks, PREG_SET_ORDER );
for( $x = 0; $x < sizeof($placemarks); $x++ ){
    preg_match_all('%<description>(.*?)</description>%s', $placemarks[$x][1], $descriptions, PREG_SET_ORDER );
    for( $y = 0; $y < sizeof($descriptions); $y++ ){
        echo $descriptions[$y][1];
    }
}

Надеюсь, это поможет...

Другие вопросы по тегам