SimpleXML_Load_String в XML с вложенными тегами изображений без захвата атрибута "url" - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь проанализировать xml, используя simplexml_load_string на старом сервере, работающем на PHP 5.3.Одним из тегов в xml является и имеет несколько вложенных дочерних элементов с атрибутом url.Если я var_dump SimpleXMLElement, изображения - это просто массив строк (дочерние элементы текстового узла каждого тега) без признаков атрибута url.

Есть какие-нибудь мысли о том, почему атрибут url в тегах не фиксируется?

Я пытался сократить атрибуты url тегов изображения примерно до 15 символов, и они до сих пор не захвачены.

Я попытался получить доступ к атрибутам как к элементу массива элемента изображения, а также вызвав метод attribute () для элемента изображения.

Пример XML

<properties xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <property>
        <reference>####</reference>
        ...
        <images>
            <image url="https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg">A2970_10776141.jpg</image>
            <image url="https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_AwVzHs_Ajc3bPh6tAooCEbZkq_ZYbRT5eAjUXsq3Znh_f~Vw--.jpg">A2970_10776142.jpg</image>
        ...
        <links/>
    </property>
    <property>
    ...
    </property>
</properties>

Мой код

$feed = file_get_contents('test.xml');
$properties = simplexml_load_string($feed);
foreach ($properties as $property) {
  var_dump($property->images);
  exit;
}

Результат

object(SimpleXMLElement)#5 (1) {
  ["image"]=>
  array(19) {
    [0]=>
    string(18) "A2970_10776141.jpg"
    [1]=>
    string(18) "A2970_10776142.jpg"
    ...
  }
}

Я также пробовал:

foreach ($property->images as $image)
{
    var_dump($image['url']);
    var_dump($image->attributes());
}

$ image ['url'] выводит NULL

$ image-> attribute () выдает ошибку о вызове attribute () для необъекта

В идеале, var_dumping $ property-> images должно выдавать:

object(SimpleXMLElement)#5 (1) {
  ["image"]=>
  array(19) {
    [0]=>
      object(SimpleXMLElement)#6 (1) {
        ["@attributes"]=>
          array(1) {
            ["url"]=>
              string(162) "https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg"
          }
        }
        [text]=> "A2970_10776141.jpg"
    }
    ...
  }
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы не используете правильное значение для цикла foreach, вы должны использовать $property->images->image, поскольку именно эти элементы вы хотите перебрать. После этого вы можете выбрать методы для доступа к атрибуту url:

$properties = simplexml_load_string($feed);
foreach ($properties as $property) {
    foreach ($property->images->image as $image) {
        echo $image['url'] . PHP_EOL;
        echo $image->attributes()['url'] . PHP_EOL;
    }
}

Выход:

https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg 
https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_JUxtL~PunupG3r34QY7hcc7wMtgouw9c1H6DUbVNANjxM_Zg--.jpg 
https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_AwVzHs_Ajc3bPh6tAooCEbZkq_ZYbRT5eAjUXsq3Znh_f~Vw--.jpg 
https://#####.#########.###/imgV1/QGcM5YXB7ITu20usXVas9zwwpfszaQl0S7VJWTlCweLw8h1OJgGrQ8SrQZiKyUwAW5EgBoJga_AwVzHs_Ajc3bPh6tAooCEbZkq_ZYbRT5eAjUXsq3Znh_f~Vw--.jpg

Демонстрация на 3v4l.org

0 голосов
/ 30 апреля 2019

Я забыл, как сильно я ненавидел SimpleXML.Это сработало для меня:

<?php

$feed = file_get_contents('test.xml');
$properties = simplexml_load_string($feed);
foreach ($properties as $property)
{
   foreach($property->images[0] as $image)
   {
      print($image['url'] . "\n");                                                 
   }
}
...