dkrnl / SimpleXMLReader

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

xpath + END_ELEMENT #1

Closed sevkin closed 10 years ago

sevkin commented 10 years ago
$this->registerCallback("/КоммерческаяИнформация/Каталог", array($this, "callbackCatalogEnd"), XMLREADER::END_ELEMENT);

вызывается, но курсор стоит на последнем элементе внутри ожидаемого

$this->registerCallback("/КоммерческаяИнформация/ПакетПредложений", array($this, "callbackOffersListEnd"), XMLREADER::END_ELEMENT);

вообще не вызывается. вот на этом семпле http://pastebin.com/UcWAaPYs

dkrnl commented 10 years ago

в чем смысл использования XMLREADER::END_ELEMENT вместо XMLREADER::ELEMENT ? я сам тестировал только XMLREADER::ELEMENT, в связке с вызовом $xml = $reader->expandSimpleXml(); внутри колбэка, хватает для парсинга почти любой информации.

sevkin commented 10 years ago

в облегчении кода для создания sideeffect`ов: по ELEMENT поднял флажок "сейчас парсю мелкооптовые цены", по END_ELEMENT опустил. и предполагалось, что парсер потоковый. или он в ELEMENT весь узел (на 100500 дочерних узлов с артикулами) уже в память отпарсил?

dkrnl commented 10 years ago

наверное такую логику не получится организовать, вот почему:

  1. внутри read поиск нужного ELEMENT производится по "простому" xpath запросу, только имена склеенные слешами. (см подробности в SimpleXMLReader::currentXpath)
  2. нативная функция XMLReader::expand копирует текущий узел и возвращает соответствующий объект DOM. это значит, что курсор всегда будет "улетать" на END_ELEMENT
distvan commented 9 years ago

I have one question. How do you registrer a callback to an Xml element by xpath? For example: /root/items/item, SimpleXmlReader::END_ELEMENT

$this->registerCallback("/root/items/item", array($this, "callbackEndItem"), XMLREADER::END_ELEMENT);

I think it will missed.

Maybe take a look at public function currentXpath and replace the switch case with if else and put a line: in_array($this->nodesType[$depth], array(self::ELEMENT, self::END_ELEMENT))