Как использовать XPath для проверки наличия узла

Я работаю с PHP и XPath, подключаясь к удаленному API на основе XML. Пример ответа от сервера приведен ниже.

    <OTA_PingRS>
        <Success />
        <EchoData>This is some test data</EchoData>
    </OTA_PingRS>

вы можете видеть, что нет стартового тега <Success> Итак, как мне искать существование <Success /> использование Xpath?

спасибо Саймон!--4-->

3 ответов


на <Success /> элемент-это пустой элемент, что означает, что он не имеет значения. Это и начало, и конец тега.

вы можете проверить наличие узлов с функцией XPath boolean()

функция boolean преобразует свой аргумент в логическое значение следующим образом:

  • число истинно тогда и только тогда, когда оно не является ни положительным, ни отрицательным нулем, ни NaN
  • набор узлов имеет значение true, если и только если он непустой
  • строка истинна тогда и только тогда, когда ее длина не равна нулю
  • объект типа, отличного от четырех основных типов, преобразуется в логическое значение способом, зависящим от этого типа

С DOMXPath вам нужно использовать DOMXPath::evaluate() метод, потому что он вернет типизированный результат, в этом случае a boolean:

$xml = <<< XML
<OTA_PingRS>
    <Success />
    <EchoData>This is some test data</EchoData>
</OTA_PingRS>
XML;

$dom = new DOMDocument;
$dom->loadXml($xml);

$xpath = new DOMXPath($dom);
$successNodeExists = $xpath->evaluate('boolean(/OTA_PingRS/Success)');

var_dump($successNodeExists); // true

демо


конечно, вы также можете просто запрос /OTA_PingRS/Success и посмотреть, есть ли результаты в возвращенном DOMNodeList:

$xml = <<< XML
<OTA_PingRS>
    <Success />
    <EchoData>This is some test data</EchoData>
</OTA_PingRS>
XML;

$dom = new DOMDocument;
$dom->loadXml($xml);

$xpath = new DOMXPath($dom);
$successNodeList = $xpath->evaluate('/OTA_PingRS/Success');

var_dump($successNodeList->length);

демо


вы также можете использовать SimpleXML:

$xml = <<< XML
<OTA_PingRS>
    <Success />
    <EchoData>This is some test data</EchoData>
</OTA_PingRS>
XML;

$nodeCount = count(simplexml_load_string($xml)->xpath('/OTA_PingRS/Success'));

var_dump($nodeCount); // 1

синтаксис:

<Success />

is в точности эквивалентно to

<Success></Success>

для того, чтобы проверить существование <Success />, вы просто используете такой путь:

//OTA_PingRS/Success[1]

теперь вы можете проверить uf результат пуст. Если да, то <Success /> элемент отсутствует.


использовать boolval($xpath) функция для проверки логического значения xpath, которое вы хотите проверить существование.