Распаковка вложенного XML-файла, содержащего список, с помощью анализатора оркестра Laravel

#laravel #xml-parsing

Вопрос:

Я хочу проанализировать список пакетов, содержащий список изображений. Однако я могу получить первый элемент, но не полный массив. Синтаксический анализатор, который я использую, — это Оркестр Ларавеля.

XML, который нужно распаковать:

 <Packages>
<Package>
  <Pictures>
    <P>20205520574081..jpg</P>
    <P>20205520574701.jpg</P>
    <P>20205520575172.jpg</P>
    <P>20205520575483.jpg</P>
    <P>20205520575955.jpg</P>
    <P>20205520576426.jpg</P>
    <P>20205520576897.jpg</P>
    <P>20205520577368.jpg</P>
    <P>20205520577989.jpg</P>
  </Pictures>
</Package>
<Package>
  <Pictures>
    <P>20205520574081..jpg</P>
    <P>20205520574701.jpg</P>
    <P>20205520575172.jpg</P>
    <P>20205520575483.jpg</P>
    <P>20205520575955.jpg</P>
    <P>20205520576426.jpg</P>
    <P>20205520576897.jpg</P>
    <P>20205520577368.jpg</P>
    <P>20205520577989.jpg</P>
  </Pictures>
</Package>
 

Мой код извлечения:

 $OfferSummary = $xml->parse([
        'Images' => ['uses' => 'Packages.Package.Picture[P]'],   
    ]);
 

Мой результат:

  ["Images"]=>
     array(1) {
        [0]=>
           array(1) {
              ["P"]=>
              string(19) "20205520574081..jpg"
          }
        ....
 }
 

Пожалуйста, обратите внимание, что возвращается только первый элемент тега pictures, и мне нужен весь массив элементов.

Спасибо!

Ответ №1:

У меня была похожая проблема. В моем XML был список, в котором у каждого подузла был атрибут name. В моем случае я нашел ответ здесь: https://github.com/orchestral/parser/blob/master/tests/Feature/DocumentTest.php#L52

В моем случае решение было:

  $parser = $xml->parse([
            'products' => ['uses' => 'products.product[attributes.attribute_group.value(::name=@)]'],
        ]);