2014-02-19 5 views
1


Я знаю, что на это был дан ответ раньше. Разумеется, я провел свой день, читая все предложения и документацию SimpleXML. Но это похоже на особый случай, и я действительно не могу сделать эту работу.Чтение атрибутов элемента SimpleXML, не работает

Чтобы узнать контекст, я разбираю файл GPX в Drupal после его загрузки с помощью hook_file_save.

Это то, что мой отладчик NetBeans говорит о переменных.

NetBeans Output

Я пытался читать «широчайшие» поля из атрибута поля во всех отношениях людей, предложенных в предыдущем посте. То, что я всегда получаю внутри поля (см. Lat5_1, _2, ...), является еще одним SimpleXMLElement с отсутствием внутри, но CLASSNAME variable value "SimpleXMLElement".

Это отрывок из файла XML, который является файлом GPX.

An exert of XML File

Я действительно не знаю, где я делаю неправильно. Я думал, что это потому, что я изолировал переменную (поведение SimpleXMLElement странно), но это не так. Спасибо за помощь.

Я добавляю кусок кода для отладки с некоторой отметкой о переменных наблюдающих:

$xml = simplexml_load_file($file->uri); 
$trkseg = $xml->trk->trkseg; // OK! 
$trkpt = $trkseg->trkpt;  // OK! 
$trkpt_c = count($trkpt);  // OK:1289 items 

$latlon5 = $trkpt[5]->attributes(); // OK includes @attributes lat lon = 59.158234 5.867209 
$latlon6 = $trkpt[6]->attributes(); // OK includes @attributes lat lon = 59.158225 5.867027 

foreach ($trkseg->trkpt as $a => $b) { 
    $c = $b->attributes()->lat;  // $b OK, $c has just classname. 
    echo $a, '="', $b, "\"\n"; 
} 

$lat5_1 = $latlon5['lat'];   // NO: has just CLASSNAME 
$lat5_2 = $latlon5->lat;   // NO: has just CLASSNAME 
// $lat5_3 = $latlon5->attributes()->{'lat'}; 
    // NOT COMPUTED! (says trying to get property of non object) 

$attribute = $latlon5->attributes();  // NOT COMPUTED! 
$lat5_4 = $attribute['lat'];    // NOT COMPUTED! 
$lat5_5 = $attribute['lon'];    // NOT COMPUTED! 

XML-фрагмент для отладки

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<gpx xmlns="http://www.topografix.com/GPX/1/1/"> 
<metadata> 
<time>2009-04-06T19:08:57Z</time> 
</metadata> 
    <trk> 
    <name>Imported</name> 
    <trkseg> 
     <trkpt lat="59.158021" lon="5.868032"> 
     <ele>0</ele> 
     <time>2007-05-21T06:00:00Z</time> 
     </trkpt> 
     <trkpt lat="59.158028" lon="5.868011"> 
     <ele>0</ele> 
     <time>2007-05-21T06:01:53Z</time> 
     </trkpt> 
[...] 
     </trkseg> 
    </trk> 
</gpx> 
+1

Вместо скриншотов, не могли бы вы предоставить небольшой образец кода XML и упрощенной версии кода для доступа к нему, как текст? Таким образом, мы можем воспроизвести проблему и тестовые решения. – IMSoP

+0

Благодарим вас за предложение. Я просто добавил необходимую часть кода. – donnadulcinea

ответ

1

Я вытащил и модифицировал этот код из SimpleXMLElement::attributes

<?php 
$string = <<<XML 
<a> 
<foo name="one" game="lonely">1</foo> 
</a> 
XML; 

$xml = simplexml_load_string($string); 
$attribute = $xml->foo[0]->attributes(); 
print $attribute['name']; 
?> 

Возможно, вы можете использовать что-то вроде:

$attribute = $latlon5->attributes(); 
print $attribute['lat']; 
print $attribute['lon']; 

Update:

<?php 
$string = <<<XML 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<gpx xmlns="http://www.topografix.com/GPX/1/1/"> 
<metadata> 
<time>2009-04-06T19:08:57Z</time> 
</metadata> 
    <trk> 
    <name>Imported</name> 
    <trkseg> 
     <trkpt lat="59.158021" lon="5.868032"> 
     <ele>0</ele> 
     <time>2007-05-21T06:00:00Z</time> 
     </trkpt> 
     <trkpt lat="59.158028" lon="5.868011"> 
     <ele>0</ele> 
     <time>2007-05-21T06:01:53Z</time> 
     </trkpt> 
     </trkseg> 
    </trk> 
</gpx> 
XML; 

$xml = simplexml_load_string($string); 
// Single simplified attribute retrieval. 
foreach($xml->trk->trkseg->trkpt[0]->attributes() as $a => $b) { 
    echo $a,'="',$b,"\"\n"; 
} 

// Iterative attribute retrieval. 

// Iterates over all instances of trkpt 
foreach($xml->trk->trkseg->trkpt as $a => $b) { 
    // iterates over all trkpt attributes 
    foreach($b->attributes() as $a => $b) { 
     //Sample lat print 
     print '<br />'; 
     //Sample interative print 
     echo $a,'="',$b,"\"\n"; 
    } 
} 

?> 

Это дает следующий вывод

lat="59.158021" lon="5.868032" 
lat="59.158021" 
lon="5.868032" 
lat="59.158028" 
lon="5.868011" 
+0

Спасибо за ваше предложение. Да, я также думаю, что это должно работать, но не вычисляет переменные (атрибут $ отсутствует при просмотре). Я начинаю думать, что это проблема компилятора? Я запускаю linux quickstart 3.2.0-58-virtual # 88-Ubuntu (это дистрибутив DrupalPro) и с помощью Netbeans 7.4 с firefox для отладки. Я добавил код на свой вопрос. – donnadulcinea

+0

Я изменил код и смог получить trkpt lat и lon соответствующим образом. –

+0

Уважаемый @Ron Williams, попробовав свой код, я все еще не мог получить доступ к переменным наблюдателем. Я не могу повторять переменные, так как Drupal делает post html parse. Поэтому я написал все переменные в файле отладки, и вот они. Благодаря вашему новому коду я смог, наконец, сосредоточиться и понять, что есть проблема с отладчиком NetBeans. Спасибо большое! – donnadulcinea

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