使用 php 和简单 XML 解析 XML

Parsing XML with php and SimpleXML

我正在解析 XML 包含房地产建筑物列表的文件。一切都很好,我可以获取每个节点并创建一个单独的带有自定义信息的 wordpress post。问题是当我尝试访问图像节点时:每个建筑物都有一个图像节点,其中包含多个图像。这就是我正在做的事情:

XML 结构

<annunci>
  <annuncio ..blablabla ...>
    ...some stuff...
    <immagine categoria="PLANIMETRIE" didascalia="img_5862" tipo="foto">659-{23d7ac25-549e-40ef-9cb2-1e6f687182ec}_0.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5864" tipo="foto">659-{8b9c3da4-edde-489a-8ca9-3dc91a0c5063}_1.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5868" tipo="foto">659-{57790b4a-2482-4a66-8f7f-1a11765d1cab}_2.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5870" tipo="foto">659-{b28b62f7-6375-4592-a269-c4ac8eac6087}_3.jpg</immagine>
        <immagine categoria="PLANIMETRIE" didascalia="img_5871" tipo="foto">659-{0bf70101-b0ec-4835-9a06-3b916ad21241}_4.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5872" tipo="foto">659-{dc5f87a1-364a-4c05-9a3a-be4cb51016f9}_5.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5875" tipo="foto">659-{2fe1524d-b454-423c-90bf-a6f9fff17e8d}_6.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5876" tipo="foto">659-{1060d120-b339-4bab-89cd-6b7781143a74}_7.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="img_5882" tipo="foto">659-{191c77d7-76f5-4fb9-873c-9221f755dcba}_8.jpg</immagine>
    <immagine categoria="PLANIMETRIE" didascalia="planimetria" tipo="foto">659-{14a9a6f0-dbf5-48a2-a204-976b9a146f43}_9.jpeg</immagine>
    ...some other stuff ...
  </annuncio>
</annunci>

这是我在插件中使用的代码:

 if (!$xml = simplexml_load_file($xml_path)) {
            echo 'unable to load XML file';
        } else {
        ...
         foreach ($xml->annuncio as $annuncio) {
          ...
          $immagini = (array)$annuncio->immagine;
          ...
          echo '<pre>';   //THIS IS FOR DEBUGGING
          print_r($immagini);
          echo '</pre>';  
         }

然后我得到了这种数组,一个对应于我正在解析的每个建筑物:

Array
(
    [@attributes] => Array
        (
            [categoria] => PLANIMETRIE
            [didascalia] => img_5862
            [tipo] => foto
        )

    [0] => 659-{23d7ac25-549e-40ef-9cb2-1e6f687182ec}_0.jpg
    [1] => 659-{8b9c3da4-edde-489a-8ca9-3dc91a0c5063}_1.jpg
    [2] => 659-{57790b4a-2482-4a66-8f7f-1a11765d1cab}_2.jpg
    [3] => 659-{b28b62f7-6375-4592-a269-c4ac8eac6087}_3.jpg
    [4] => 659-{0bf70101-b0ec-4835-9a06-3b916ad21241}_4.jpg
    [5] => 659-{dc5f87a1-364a-4c05-9a3a-be4cb51016f9}_5.jpg
    [6] => 659-{2fe1524d-b454-423c-90bf-a6f9fff17e8d}_6.jpg
    [7] => 659-{1060d120-b339-4bab-89cd-6b7781143a74}_7.jpg
    [8] => 659-{191c77d7-76f5-4fb9-873c-9221f755dcba}_8.jpg
    [9] => 659-{14a9a6f0-dbf5-48a2-a204-976b9a146f43}_9.jpeg
)

首先,我无法摆脱 的属性,而且,当我尝试访问像

这样的单个图像时,我总是会出错
echo $immagini[0];

我很确定这是愚蠢的事情,但我找不到解决方案,有人可以帮助我吗?

编辑 1 对不起,错误是当我尝试循环访问单个图像时:

foreach($immagini as $test) {
                echo $test;
            }

我收到通知:数组到字符串的转换...

编辑 2 我用 FOR 循环解决了,但还是不明白:D 不管怎样,它起作用了!

男人,

我希望先使用 DOMDocument 然后使用 SimpleXML。

当处理复杂的 XML 数据时,解决方案可能不是 "Simple",那么您可能不会使用简单 XML 来做这些事情。

使用 DOMDocument,我解决了使用 DOMDocument 为航空公司订票的复杂问题。

<?php
$dom = new DOMDocument();
$dom->loadXML('/path/to/xml.xml');
foreach ($dom->getElementsByTagName('annuncio') as $annuncio){
    foreach ($annuncio->getElementsByTagName('immagine') as $immagine){
        $categoria = $immagine->getAttribute('categoria');
    }
}
?>

享受DOM!