使用PHP读取多级XML(SimpleXML)

时间:2017-08-28 20:41:53

标签: php xml simplexml

我正在努力学习能够读取以下XML文件的PHP代码:

<putovanja agencija="Kompas Zagreb d.d.">
  <putovanje url="http://www.kompas.hr/Packages/Package.aspx?idPackage=3151" tip="Krstarenja Jadranom" destinacija="Krstarenja" naziv="Mini Krstarenje Jadranom Zadar-Opatija (5 noći, jedan smjer) " id="3151" polazak="Zadar (Krstarenje)">
    <ukrcaji>
      <ukrcaj>Zadar</ukrcaj>
    </ukrcaji>
    <datumiIcijene>
      <data od="28.08.2017" do="02.09.2017" cijena="3695"/>
      <data od="04.09.2017" do="09.09.2017" cijena="3360"/>
      <data od="11.09.2017" do="16.09.2017" cijena="3360"/>
    </datumiIcijene>
  </putovanje>
  <putovanje url="http://www.kompas.hr/Packages/Package.aspx?idPackage=3151" tip="Odmor" destinacija="Krstarenja" naziv="Mini Krstarenje Jadranom Zadar-Opatija (5 noći, jedan smjer) " id="3151" polazak="Zadar (Krstarenje)">
    <ukrcaji>
      <ukrcaj>Zadar</ukrcaj>
    </ukrcaji>
    <datumiIcijene>
      <data od="28.08.2017" do="02.09.2017" cijena="3695"/>
      <data od="04.09.2017" do="09.09.2017" cijena="3360"/>
    </datumiIcijene>
  </putovanje>
</putovanja>

我在网上找到了样本,更具体地说是w3schools(https://www.w3schools.com/php/php_xml_simplexml_get.asp),我明白我的XML更复杂,但我甚至无法获得第一个&#34; CHILD&#34;的URL。我认为循环通过正确的孩子,因为它在输出中写入BREAK两次。有没有人知道我犯了什么错误?

我很抱歉,如果我的问题很愚蠢,我还在学习如何编码。

感谢所有的帮助,祝大家节日愉快:D

哦,我现在的代码:

<?php
$xml=simplexml_load_file("putovanja.xml") or die("Error: Cannot create object");
foreach($xml->children() as $putovanja) {
    echo $putovanja->putovanje['url'];
    echo "Break <br>";
}
?>

1 个答案:

答案 0 :(得分:1)

以下是访问网址的方法:

$xml=simplexml_load_file("putovanja.xml") or die("Error: Cannot create object");

foreach($xml->putovanje as $p) {
    echo $p->attributes()->url;
    echo "\n";
}

您不需要children(),并且您会发现attributes()有用

要访问更多元素,请参阅以下示例:

<?php
$xml=simplexml_load_file("putovanja.xml") or die("Error: Cannot create object");

foreach($xml->putovanje as $p) {
    echo $p->attributes()->url;
    echo "\n";
    echo $p->ukrcaji->ukrcaj;    
    echo "\n";    
    echo $p->datumiIcijene->data[0]->attributes()->od;           
    echo "\n\n";
}

如果您在循环中添加print_r($p);,那么您将看到数据结构,并能够按照我的示例访问您需要的其他元素。