加载标记文件xml PHP

时间:2018-11-07 22:29:05

标签: php xml simplexml

我有一个XML文件,想获取<arquivo>标记中的值

<Listings>
    <Listing>
      <id>1</id>
      <endereco>abc</endereco>
      <Media>
        <foto>
          <arquivo>foto1.jpg</arquivo>
        </foto>
        <foto>
          <arquivo>foto2.jpg</arquivo>
        </foto>
      </Media>
    </Listing>
    <Listing>
      <id>2</id>
      <endereco>rua X</endereco>
      <Media>
        <foto>
          <arquivo>...</arquivo>
        </foto>
        <foto>
          <arquivo>...</arquivo>
        </foto>
      </Media>
    </Listing>
</Listings>

但是我不确定我的PHP有什么问题

$listings = simplexml_load_file("file.xml");

foreach ($listings as $listing):

    echo 'endereco: ' . trim($listing->endereco) . "<br>";

    foreach($listing->Media as $items):
        foreach($items as $item):
            echo 'Image: ' . trim($item) . "<br>";
        endforeach;
    endforeach;

endforeach;

我的代码的结果是

endereco: abc
Imagem: 
Imagem: 
endereco: rua X
Imagem: 
Imagem:

但我希望是这样

endereco: abc
Imagem: foto1.jpg
Imagem: foto2.jpg
endereco: rua X
Imagem: ...
Imagem: ...

2 个答案:

答案 0 :(得分:2)

您需要像在enderco中那样输入结构的每个级别。看看:

$x = new simplexmlelement('<Listings>
<Listing>
  <id>1</id>
  <endereco>abc</endereco>
  <Media>
    <foto>
      <arquivo>foto1.jpg</arquivo>
    </foto>
    <foto>
      <arquivo>foto2.jpg</arquivo>
    </foto>
  </Media>
</Listing></Listings>');
foreach ($x as $listing):
    echo 'endereco: ' . trim($listing->endereco) . "<br>";
    foreach($listing->Media as $items):
            foreach($items->foto as $foto):
                echo 'Image: ' . trim($foto->arquivo) . "<br>";
            endforeach;
        endforeach;
endforeach;

https://3v4l.org/0bcfj

答案 1 :(得分:1)

在根元素周围使用foreach循环,然后使用XPath查询来更轻松地访问内部元素。仍然具有两个foreach循环的技巧,但应该可以正常工作。

<?php
$listings = simplexml_load_file("file.xml");
foreach ($listings as $listing) {
    echo "endereco: $listing->endereco<br/>";
    $arquivos = $listing->xpath("Media/foto/arquivo");
    foreach ($arquivos as $ar) {
        echo "Imagem: $ar<br/>";
    }
}