2016-01-09 108 views
1

我有下面这个xml结构。对于每个'地点'(在每个“土地”),我需要'id'值,它是'sneeuwkwaliteit'。用simplexml解析复杂的xml

我的努力,到目前为止,并没有返回“sneeuwkwaliteit”的值:

$sneeuw = simplexml_load_file('ski.xml'); 
echo $sneeuw->land[0]->locaties[0]->sneeuw->{'ski'}->sneeuwkwaliteit; 


<sneeuw> 
    <aanmaak_tijd>09-01-2016 07:48</aanmaak_tijd> 
    <landen> 
    <land id="Andorra"> 
     <locaties> 
     <locatie id="Arinsal/Pal"> 
      <ski> 
      <datum_tijd>09-01-2016</datum_tijd> 
      <sneeuwhoogte_dal>40</sneeuwhoogte_dal> 
      <sneeuwhoogte_berg>70</sneeuwhoogte_berg> 
      <sneeuwkwaliteit>De aanwezige sneeuw is poedersneeuw.</sneeuwkwaliteit> 
      <datum_laatste_sneeuwval>07-01-2016</datum_laatste_sneeuwval> 
      <hoeveelheid_laatste_sneeuwval>20</hoeveelheid_laatste_sneeuwval> 
      <totaal_aantal_liften>25</totaal_aantal_liften> 
      <aantal_liften_geopend>25</aantal_liften_geopend> 
      </ski> 
     </locatie> 
     </locaties> 
    </land> 
    </landen> 
</sneeuw> 
+1

试图缩进的XML,以便看到结构更好,也许使用'landen [0]'而不是'land [0]'。我不知道关于PHP,但如果这是一个JSON对象,我会像这样遍历它:'sneeuw.landen [0] .locaties [0] .ski.sneeuwkwaliteit' –

+0

“landen”和“土地“(他们也可能是”富“和”酒吧“)。您必须解决所有级别:sneeuw.landen [0] .land [0] .locaties [0] .locatie [0] .ski [0] .sneeuwkwaliteit。您可能会省略[0],其中多个条目是不可能的。 – TheRoadrunner

回答

1

只要认真遵循从XML的根目标元素的路径:

$xml = <<<XML 
<sneeuw> 
    <aanmaak_tijd>09-01-2016 07:48</aanmaak_tijd> 
    <landen> 
    <land id="Andorra"> 
     <locaties> 
     <locatie id="Arinsal/Pal"> 
      <ski> 
      <datum_tijd>09-01-2016</datum_tijd> 
      <sneeuwhoogte_dal>40</sneeuwhoogte_dal> 
      <sneeuwhoogte_berg>70</sneeuwhoogte_berg> 
      <sneeuwkwaliteit>De aanwezige sneeuw is poedersneeuw.</sneeuwkwaliteit> 
      <datum_laatste_sneeuwval>07-01-2016</datum_laatste_sneeuwval> 
      <hoeveelheid_laatste_sneeuwval>20</hoeveelheid_laatste_sneeuwval> 
      <totaal_aantal_liften>25</totaal_aantal_liften> 
      <aantal_liften_geopend>25</aantal_liften_geopend> 
      </ski> 
     </locatie> 
     </locaties> 
    </land> 
    </landen> 
</sneeuw> 
XML; 
$sneeuw = simplexml_load_string($xml); 
echo $sneeuw->landen[0]->land[0]->locaties[0]->locatie[0]->ski[0]->sneeuwkwaliteit; 

eval.in demo

输出:

De aanwezige sneeuw is poedersneeuw. 

为了针对XML更复杂的查询,看看XPath,它有它自己的规范。然后您可以使用SimpleXMLElement::xpath()函数执行XPath表达式。

UPDATE:

您可以使用XPath,如上面提到的,通过在同一路径上的所有sneeuwkwaliteit元素迭代:

.... 
$result = $sneeuw->xpath('/sneeuw/landen/land/locaties/locatie/ski/sneeuwkwaliteit'); 
foreach($result as $r){ 
    echo $r ."<br>"; 
} 
+0

这太棒了。是否可以为每个循环创建一个,因为这是第一个集合(0)。 – mark

+0

@mark请参阅**更新**部分的一种可能的方法 – har07