VicTHOR
@VicTHOR
(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻

Как правильно парсить большой xml с tns тегами?

Есть некий xml файл, весит больше 1ГБ, минифицированный.
Я восстановил кусочек в начале для понимания схемы
spoiler
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tns:INSPECTIONS xmlns:tns="ссылка" YEAR="2020" MONTH="1">

    <tns:INSPECTION данные>
        <tns:OKATO FEDERAL_DISTRICT="" данные/>
        <tns:I_OBJECT ADDRESS="" данные>
            <tns:I_RESULT ACT_DATE_CREATE="" данные>
                <tns:I_RESULT_INSPECTOR FULL_NAME="" данные />
                <tns:I_VIOLATION IVIOLATION_TYPE_NAME="" данные>
                    <tns:V_INJUNCTION CODE="" данные />
                </tns:I_VIOLATION>
            </tns:I_RESULT>
        </tns:I_OBJECT>
        <tns:I_SUBJECT IS_RESIDENT="" данные />
        <tns:I_CLASSIFICATION ICARRYOUT_TYPE_NAME="" данные />
        <tns:I_AUTHORITY FRGU_ORG_ID_BK="" данные/>
        <tns:I_APPROVE START_DATE="" данные>
            <tns:I_APPROVE_DOCS IAPPROVE_DOC_NAME="" данные />
        </tns:I_APPROVE>
    </tns:INSPECTION>

</tns:INSPECTIONS>

Если загрузить файл через simplexml_load_file(), то в итоге получаю только атрибуты YEAR="2020" MONTH="1" (в поле @attributes), а полей как-бы никаких нет...

Попробовал заменить все tns: на пустоту, simplexml_load_string() выдает internal error: Huge input lookup, добавил опцию LIBXML_PARSEHUGE, получаю ошибку simplexml_load_string(): Memory allocation failed : growing input buffer

Как корректно работать с таким файлом?
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
VicTHOR
@VicTHOR Автор вопроса
(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻
скомбинировал все что можно
$reader = new XMLReader();
$reader->open($path);

while($reader->read()) {
    if (
        $reader->nodeType == XMLReader::ELEMENT
        && $reader->hasAttributes
        && $reader->localName === 'INSPECTION'
    ) {
        $xml = simplexml_load_string(str_replace('tns:', '', $reader->readOuterXml()));
        var_dump( json_decode(json_encode($xml), true) );
    } else continue;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Ну стандартная же ошибка: не используют для больших файлов simplexml, он и сам на это ругается.
XmlReader должен без проблем его прожевать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы