我正在使用PHP和XPath连接到基于远程XML的API。来自服务器的示例响应如下所示。
<OTA_PingRS>
<Success />
<EchoData>This is some test data</EchoData>
</OTA_PingRS>
您可以看到没有起始标记<Success>
,那么如何使用Xpath搜索<Success />
的存在?
由于 西蒙
答案 0 :(得分:8)
<Success />
元素是empty element,意味着它没有价值。它是开始和结束标记。
你可以test for existence of nodes with the XPath function 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
当然,您也可以只查询/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
答案 1 :(得分:2)
语法:
<Success />
<Success></Success>
为了测试<Success />
的存在,你只需使用这样的路径:
//OTA_PingRS/Success[1]
您现在可以测试结果是否为空。如果是,则<Success />
元素不存在。
答案 2 :(得分:0)
使用boolval($xpath)
函数检查要检查存在的xpath的布尔值。