Если возвращается 1 результат, я не хочу, чтобы он был в виде массива - это то, что возвращается.Я просто хочу получить значение без необходимости доступа к элементу [0] результата и приведению к строке.
Это возможно с XPath's string
function
Набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, который находится первым в порядке документов.Если набор узлов пуст, возвращается пустая строка.
и Метод evaluate
DOMXPath:
Возвращает типизированный результат, есливозможно или DOMNodeList, содержащий все узлы, соответствующие данному выражению XPath.
Пример:
$dom = new DOMDocument;
$dom->loadXML('<root foo="bar"/>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/@foo)')); // string(3) "bar"
Если был встроенный способ xpath для получения первого и только первого значения узлатогда это было бы намного предпочтительнее, чем написание функции для этого
Вы можете использовать функцию position
:
Функция положениявозвращает число, равное позиции контекста, из контекста вычисления выражения.
Пример:
$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[position() = 1]/@xml:id)')); // string(2) "f1"
или сокращенный синтаксис
$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[1]/@xml:id)')); // string(2) "f1"
Обратите внимание, что при запросе потомков с // использованием функции position может быть получен множественный результат из-за способа вычисления выражения.