2014-02-19 26 views
1


我知道這已被回答過。我花了我的下午閱讀所有建議和課程的SimpleXML文檔。但這似乎是一種特殊情況,我真的無法完成這項工作。讀取SimpleXML元素屬性,不起作用

爲了解上下文,我在解析由hook_file_save上傳的Drupal中的GPX文件。

這就是我的NetBeans調試器對變量所說的內容。

NetBeans Output

我想讀的人在以前的帖子提出的所有方式的「LAT」從現場的屬性字段。我總是在場內檢索到的內容(請參閱lat5_1,_2,...)是另一個SimpleXMLElement,其中沒有任何內容,但CLASSNAME變量值爲「SimpleXMLElement」。

這是從GPX文件的XML文件中摘錄的。

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']; 

更新:

<?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快速入門3.2.0-58-virtual#88-Ubuntu(它是一個DrupalPro發行版),並使用Netbeans 7.4與firefox進行調試。 我給我的問題添加了一些代碼。 – donnadulcinea

+0

我修改了代碼,能夠恰當地檢索trkpt lat和lon。 –

+0

親愛的@Ron Williams在嘗試你的代碼後仍然無法通過觀察者訪問變量。由於Drupal正在進行post html解析,因此我無法回顯變量。所以我把所有的變量寫在一個調試文件中,並且他們在那裏。 感謝您的新代碼,我終於可以專注並理解NetBeans調試器存在問題。 非常感謝! – donnadulcinea