2015-01-01 3 views
1

Мне было интересно, может ли кто-нибудь помочь мне с кодом.XML/PHP - Извлечение информации из нескольких узлов документа

У меня есть KML (Google Earth XML), который я пытаюсь импортировать в мое приложение.

Проблема, связанная с тем, что при извлечении данных она отлично работает до первой вещи узла и не обрабатывает остальную часть файла.

файл KML массивен, поэтому я покажу образец ниже:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
<Folder> 
    <name>Kalamunda</name> 
    <open>1</open> 
    <Document> 
     <name>Export 1418786594.kml</name> 
     <Placemark> 
      <name>76-122 Tourist Drive 207</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.072723865509,-31.98064436184923,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>76-122 Tourist Drive 207</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0731288790703,-31.98067621355563,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>76-122 Tourist Drive 207</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0735687613487,-31.98064436184923,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>12 Hinkler Rd</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0740676522255,-31.98083319680418,0</coordinates> 
      </Point> 
     </Placemark> 
    </Document> 
    <Document> 
     <name>Export 1418785221.kml</name> 
     <Placemark> 
      <name>LOT 435 Collins Rd</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0624188184738,-31.97887202447751,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>25 Central Rd</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0589158535004,-31.9744125903374,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>49 Canning Rd</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0574942827225,-31.97629422494352,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>13 Anne Ave</name> 
      <description>Walliston WA 6076</description> 
      <Point> 
       <coordinates>116.0673272609711,-31.99400063250859,0</coordinates> 
      </Point> 
     </Placemark> 
    </Document> 
    <Document> 
     <name>Export 1418783501.kml</name> 
     <Placemark> 
      <name>3 Lookout Rd</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.037417948246,-31.98043960061557,0</coordinates> 
      </Point> 
     </Placemark> 
     <Placemark> 
      <name>9 Ozone Terrace</name> 
      <description>Kalamunda WA 6076</description> 
      <Point> 
       <coordinates>116.0382279753685,-31.98028261669366,0</coordinates> 
      </Point> 
     </Placemark> 
    </Document> 
</Folder> 
</kml> 

код им с помощью следующим образом:

$i = 0; 
    foreach($xml_data->Folder->Document->Placemark as $placemark) { 

     $data[$i][] = $placemark->name; 
     $data[$i][] = $placemark->description; 

     list($x, $y) = explode(',', $placemark->Point->coordinates); 
     $data[$i][] = array($x, $y); 

     $i++; 

    } 

Используя этот код, он будет извлекать данные до тех пор, 12 меток Hinkler Rd, я думаю, потому что есть закрывающий тег, он не будет идти дальше.

Как я могу извлечь все данные, предоставленные XML в этом формате?

Любая помощь была бы принята с благодарностью.

Приветствия,

+0

Это 'Плейлист' вас интересует - имя, описание, координаты? –

+0

Да @MichaelBerkowski – BigJobbies

ответ

2

<Placemark> Все узлы наиболее легко получены с помощью запроса XPath. Поскольку они находятся под пространством имен kml, вы можете запросить //kml:Placemark. // будет искать выражение Placemark на любом уровне XML.

Мы можем значительно упростить внутреннюю работу петли, которую вы изначально использовали, с умным использованием array_slice() в сочетании с explode(), который у вас уже был. Вложение explode() внутри array_slice(), извлечение первых двух компонентов координат и отбрасывание третьего (,0) может происходить в одном действии и сразу же назначить их на ключ массива ['coordinates'].

Кроме того, вместо поддержания увеличивающиеся $i, вы можете use the [] array append syntax просто придерживаться нового суб-массива на массив $data сбора непосредственно.

// Query all <Placemark> elements at once 
$placemarks = $xml_data->xpath('//kml:Placemark'); 
// Loop over them and construct an array of child properties 

$data = array(); 
foreach ($placemarks as $mark) { 
    // Collect the properties into a new array and append 
    // that to $data with [] 
    $data[] = array(
    // Cast SimpleXML elements to strings with (string) 
    'name' => (string)$mark->name, 
    'description' => (string)$mark->description, 
    // Get the coords in one action - explode on the ',' 
    // but return only the first two elements via array_slice() 
    'coordinates' => array_slice(explode(',', $mark->Point->coordinates), 0, 2) 
); 
} 
print_r($data); 
// Displays: 
Array 
(
    [0] => Array 
     (
      [name] => 76-122 Tourist Drive 207 
      [description] => Kalamunda WA 6076 
      [coordinates] => Array 
       (
        [0] => 116.072723865509 
        [1] => -31.98064436184923 
       ) 

     ) 

    [1] => Array 
     (
      [name] => 76-122 Tourist Drive 207 
      [description] => Kalamunda WA 6076 
      [coordinates] => Array 
       (
        [0] => 116.0731288790703 
        [1] => -31.98067621355563 
       ) 

     ) 

    [2] => Array 
     (
      [name] => 76-122 Tourist Drive 207 
      [description] => Kalamunda WA 6076 
      [coordinates] => Array 
       (
        [0] => 116.0735687613487 
        [1] => -31.98064436184923 
       ) 

     ) 
    ... SNIP.... 
    ... SNIP.... 
    ... SNIP....  
    [8] => Array 
     (
      [name] => 3 Lookout Rd 
      [description] => Kalamunda WA 6076 
      [coordinates] => Array 
       (
        [0] => 116.037417948246 
        [1] => -31.98043960061557 
       ) 

     ) 

    [9] => Array 
     (
      [name] => 9 Ozone Terrace 
      [description] => Kalamunda WA 6076 
      [coordinates] => Array 
       (
        [0] => 116.0382279753685 
        [1] => -31.98028261669366 
       ) 

     ) 

) 
+0

Эй, спасибо за это. Я получаю сообщение об ошибке, неожиданно [в строке, которая имеет $ data = []; – BigJobbies

+0

У вас не должно быть PHP 5.4. Вместо этого используйте '$ data = array().'. Точно так же в цикле вам понадобится '$ data [] = array (...)' вместо '$ data [] = [...]' Darn - это, вероятно, был первый раз, когда я использовал синтаксис 5,4+ в ответ, надеясь, что базовая установка окончательно достаточно высока :-( –

+0

@BigJobbies Я только что отредактировал, чтобы преобразовать его обратно в старые объявления 'array()'. Когда-нибудь, я думаю ... –

Смежные вопросы