2016-05-01 145 views
-1

我不是很熟悉PHP(剛開始學習),我有一個問題: 我有一個服務器上的xml文件(從前夕...但誰在乎),我管理它來「讀」這個文件。它有這樣的結構:simplexml獲取值並非所有屬性

<result> 
    <rowset> 
      <row name="abc" id="def" ...> 
      <row name="abc" id="def" ...> 
      <row name="abc" id="def" ...> 
      ... 
    </rowset> 
</result> 

搜索一些網頁我發現一種方法來呼應所有行的所有屬性。 這裏是我的代碼:

<?php 
$url = "http://api.eveonline.com/eve/AllianceList.xml.aspx?version=1"; 

$xml = simplexml_load_file($url); 

$nrOfRows = $xml->result[0]->rowset[0]->count(); 
$n = 0; 

for ($n = 0; $n <= $nrOfRows; $n++) { 
    foreach($xml->result[0]->rowset[0]->row[$n]->attributes() as $a => $b) { 
     echo $a, " = ", $b, "<br>"; 
    } 
} 
?> 

,結果我得到:

name = abc 
id = def 
... 
name = abc 
id = def 
... 

這看起來不錯,但那不是正是我想要的。 我只需要所有行的特殊屬性。例如我想要所有行的所有名稱作爲結果。

感謝您的任何幫助。 沙利葉

回答

0

您可以使用數組語法來訪問單個屬性:

echo $xml->result[0]->rowset[0]->row[$n]['name']; 

將輸出:

Goonswarm Federation 
Pandemic Horde 
Test Alliance Please Ignore 
(...) 

另外請注意,您可以通過這種方式簡化代碼:

foreach($xml->result[0]->rowset[0]->row as $row) 
{ 
    echo $row['name'] . '<br>'; 
} 
+0

非常感謝! 「echo $ xml-> result [0] - > rowset [0] - > row [$ n] ['name'];」是exaktly我正在尋找:)並簡化循環是一個好主意 – Sariel

0

下面是一個使用構建在DOMDocumentDOMXpath

$xml = <<< LOL 
<result> 
    <rowset> 
      <row name="abc" id="def" lang="pt">Olá</row> 
      <row name="abc" id="def" lang="en">Hello</row> 
      <row name="abc" id="def" lang="fr">Bonjour</row> 
    </rowset> 
</result> 
LOL; 

$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadXML($xml); 
$xpath = new DOMXpath($dom); 
foreach ($xpath->query("//row") as $row){ 
    echo $row->getAttribute('name'); 
    echo $row->getAttribute('id'); 
    echo $row->getAttribute('lang'); 
    echo $row->textContent; 
} 

上面的例子將得到nameidlang屬性和每一行元素的文本text的例子。

Ideone Demo


如果需要通過idclass,使用過濾行;

$xpath->query("//row[@class='someClass']") 
$xpath->query("//row[@id='someId']")