2016-05-01 106 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']")