Or use XMLReader::ELEMENT and XMLReader::END_ELEMENT rather than the numbers 1 and 15.(PHP 5 >= 5.1.0, PHP 7, PHP 8)
XMLReader::getAttribute — 名前をもとに、属性の値を取得する
   指定した名前の属性の値を返します。属性が存在しなかったり
   現在位置が要素ノードでなかったりした場合には null を返します。
  
name属性の名前。
   属性の値を返します。指定した名前 name の
   属性が見つからなかったり、現在位置が要素ノードではなかったりした場合には
   null を返します。
  
| バージョン | 説明 | 
|---|---|
| 8.0.0 | この関数は falseを返さなくなりました。 | 
Or use XMLReader::ELEMENT and XMLReader::END_ELEMENT rather than the numbers 1 and 15.might be obvious, but not to everyone ;-) ... when reading attributes from a node that has sub-nodes (and creating an output from this node), the output will be issued twice, once on the <ELEMENT> tag and once on the end tag </ELEMENT>. To avoid this, you can test on which part of the node you are using the property nodeType. 
It'll be 1 for the element, 15 for the end element.To get all attributes and their names, use something like this:
<?php
function getAttributes($reader)
{
    $attributes = [];
    for ($i = 0; $i < $reader->attributeCount; $i++) {
        $reader->moveToAttributeNo($i);
        $attributes[$reader->name] = $reader->value;
    }
    return $attributes;
}
?>