Как использовать 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, которое вы хотите проверить существование.