Вы должны быть в состоянии получить данные, используя ...
$selected = $xml->xpath("//bms:Selected[bms:NumInfo/bms:NumType='HI']")[0];
echo (string)$selected->children("bms",true)->Desc;
Обратите внимание на [0]
в конце функции XPath, это, как вы говорите, потому что она возвращает список совпадающих узлов. Обычно вы используете это в foreach()
, но если есть только один, вы можете сократить его таким образом.
Когда вы выбираете узел, это на самом деле SimpleXMLElement, с помощью (string)
преобразует значение в строку, что позволяет вам более гибко использовать его в качестве значения (echo
делает это в любом случае, но это просто для демонстрации принцип)
Бит ->children("bms",true)
возвращает все дочерние узлы в пространстве имен (используя префикс), и это позволяет вам использовать ->Desc
без префикса.
Даже если вы зарегистрируете пространство имен, вам все равно нужно будет использовать его в своих выражениях XPath, это позволяет смешивать пространства имен и элементы. У вас может быть тот же именованный элемент, но другое пространство имен, так что это гарантирует, что вы ссылаетесь на правильный.