用php和SimpleXML解析XML


Parsing XML with php and SimpleXML

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

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数据时,解决方案可能不是"简单"的,那么您可能不会使用SimpleXML来做这些事情。

使用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!