В XMLReader есть проблема.
Если у вас есть такой пустой элемент: <test></test>
Вы получите ЭЛЕМЕНТ и END_ELEMENT.
Однако, если вы используете самозакрывающийся тег: <test />
Вы получаете только ЭЛЕМЕНТ, и НЕТ END_ELEMENT.
Простое решение - проверить, если $xmlReader->isEmptyElement
на каждом УЗЛЕ ЭЛЕМЕНТА. Это позволит вам узнать, является ли это самозакрывающимся тегом, затем вы можете его пропустить.