dkrnl / SimpleXMLReader

Wrapped XMLReader class, for simple SAX-reading of huge xml.
112 stars 43 forks source link

Рекурсия или родитель #4

Closed luckyraul closed 8 years ago

luckyraul commented 8 years ago

Добрый день.

Не можете - нужно достать данные по каждой группе с учетом вложенности. 1) Жаль что не работают XPath запросы с рекурсией. вида /КоммерческаяИнформация/Классификатор/Группы//Группа

Если делать callback по Группа и expand там - то не понятно, как вытащить информацию о родителе.

<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.07" ДатаФормирования="2016-01-12T13:45:00">
    <Классификатор СодержитТолькоИзменения="false">
        <Ид>798d3ae4-3c2c-4a53-9bc4-589e2db9c7af</Ид>
        <ИдКлассификатора>798d3ae4-3c2c-4a53-9bc4-589e2db9c7af</ИдКлассификатора>
        <Наименование>Классификатор (Основной каталог товаров)</Наименование>
        <Владелец>
            <Ид>abf70f82-922a-11df-89ba-001a64b08c02</Ид>
        </Владелец>
        <Группы>
            <Группа>
                <Ид>7648d1fb-bbee-11e4-80d3-a0d3c1f1cfaa</Ид>
                <Наименование>NEW YEAR 2016</Наименование>
                <Группы>
                    <Группа>
                        <Ид>f49c9b56-a3fc-11e5-80ea-a0d3c1f1cfaa</Ид>
                        <Наименование>Новогодний базар</Наименование>
                    </Группа>
                    <Группа>
                        <Ид>b7019a7f-a550-11e5-80ea-a0d3c1f1cfaa</Ид>
                        <Наименование>Подарок для Него </Наименование>
                    </Группа>
                    <Группа>
                        <Ид>30024644-552d-11e5-80e2-a0d3c1f1cfa9</Ид>
                        <Наименование>Подарок для Неё</Наименование>
                    </Группа>
                </Группы>
            </Группа>
            <Группа>
                <Ид>9edf9938-facf-11e3-b5c1-001a64b08c00</Ид>
                <Наименование>АРОМАТЫ</Наименование>
                <Группы>
                    <Группа>
                        <Ид>6cfb9f22-0a30-11e5-80dc-a0d3c1f1cfaa</Ид>
                        <Наименование>Ароматы для дома и свечи</Наименование>
                    </Группа>
                    <Группа>
                        <Ид>9edf9939-facf-11e3-b5c1-001a64b08c00</Ид>
                        <Наименование>Женские ароматы</Наименование>
                    </Группа>
                </Группы>
            </Группа>
        </Группы>
    </Классификатор>
</КоммерческаяИнформация>
dkrnl commented 8 years ago

Добрый!

Прошу прощения за задержку с ответом.

Полную поддержку XPath я не знаю как реализовать в связке c SAX. Сейчас работают только простые выражение, подобные структуре директорий, "/a/b[attr='val']/c/d" или по имени тега -- "группа".

Как идеи для вашего случая, три отделенных обработчика на: "/КоммерческаяИнформация/Классификатор/Группы/Группа", "Группы" и "Группа". И контролировать стек вложенности тегов -- что очень не тривиально.

Однако вопрос, стоит ли этого? Предположим что размер корневых групп -- "/КоммерческаяИнформация/Классификатор/Группы/Группа" небольшой и умещается в памяти. Тогда:

 $this->registerCallback("/КоммерческаяИнформация/Классификатор/Группы/Группа", function($reader) {
   $rootGroup =  $reader->expandSimpleXml(); // тут и будет основное потребление памяти.
   $subGroup =  $rootGroup->xpath("/Группы"); 
   // дальше рекурсивно бегать по группам
});
luckyraul commented 8 years ago

Большое спасибо, очень помогло.