XMLReader Пропустить родительский узел - PullRequest
0 голосов
/ 15 октября 2019

Из документации :

Расширение XMLReader представляет собой синтаксический анализатор XML. Считыватель действует как курсор, идущий вперед по потоку документов и останавливающийся у каждого узла на пути

Я хочу перейти к следующему, но родительский узел <group> блокирует меня.

Структура XML

<group name="blabla">
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
</group>
<group name="blabla">
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
 <o>
  <id>Value</id>
  <name>Value</name>
  <category>Value</category>
 </o>
</group> etc..

Я хочу перейти к следующему, но родительский узел блокирует меня.

<?php
$reader = new XMLReader();
$reader->open($fileTMP);

while (true) {
    if ($reader->nodeType === XMLReader::ELEMENT
        && $reader->name === XML_PRODUCT_ELEMENT_NAME
        && $reader->isEmptyElement === false) {

        $item = simplexml_load_string($reader->readOuterXML(), null, LIBXML_NOCDATA);

        $product = [];
        $product['id'] = trim((string) $item->id);
        $product['name'] = trim((string) $item->name);

        if (isset($item->imgs->i)) {
            foreach ($item->imgs as $image) {
                $product['foto'][] = trim((string) $image->i['url']);
            }
        }

        if (!$reader->next(XML_PRODUCT_ELEMENT_NAME)) {
            break;
        }
    } else if (!$reader->read()) {
        break;
    }
}

$reader->close();

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, что ваша основная проблема в том, что когда вы доберетесь до

     if (!$reader->next(XML_PRODUCT_ELEMENT_NAME)) {
         break;
     }

Вы читали бы последовательность <o> элементов, а затем, когда закончится первый набор, он доберется до этого, посмотрите, чтоэто не элемент <o> и выход из цикла чтения. Поэтому сначала закомментируйте / удалите этот код.

Затем, чтобы убедиться, что он читает документ, измените

       elseif (!$reader->read()) {

на

       if (!$reader->read()) {

, это означает, что этот код будет всегдаработайте в основном цикле, если у вас нет элемента <o>, и пропускаете любые не связанные узлы.

...