如何使用XPath检查<Success />节点是否存在

Pre*_*cks 7 php xml xpath

我正在使用PHP和XPath连接到基于远程XML的API.来自服务器的示例响应如下所示.

    <OTA_PingRS>
        <Success />
        <EchoData>This is some test data</EchoData>
    </OTA_PingRS>
Run Code Online (Sandbox Code Playgroud)

您可以看到没有起始标记,<Success>那么如何搜索<Success />使用Xpath 的存在?

谢谢西蒙

Gor*_*don 8

<Success />元素是一个空元素,这意味着它没有价值.它是开始和结束标记.

您可以使用XPath函数测试节点是否存在boolean()

布尔函数将其参数转换为布尔值,如下所示:

  • 当且仅当它既不是正零或负零也不是NaN时,数字为真
  • 当且仅当它是非空的时,节点集才为真
  • 当且仅当其长度为非零时,字符串才为真
  • 除了四种基本类型之外的类型的对象将以依赖于该类型的方式转换为布尔值

要做到这一点DOMXPath你需要使用该DOMXPath::evaluate()方法,因为它将返回一个类型化的结果,在这种情况下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
Run Code Online (Sandbox Code Playgroud)

演示


当然,您也可以只查询/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);
Run Code Online (Sandbox Code Playgroud)

演示


您还可以使用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
Run Code Online (Sandbox Code Playgroud)