8

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

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

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

谢谢西蒙

4

3 回答 3

10

<Success />元素是一个空元素,这意味着它没有任何价值。它既是开始标签,也是结束标签。

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

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

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

为此,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
于 2012-09-05T20:47:32.570 回答
2

语法:

<Success />

完全等同

<Success></Success>

为了测试 的存在<Success />,您只需使用如下路径:

//OTA_PingRS/Success[1]

您现在可以测试 uf 结果为空。如果是,则该<Success />元素不存在。

于 2012-09-05T21:22:50.677 回答
0

使用boolval($xpath)函数检查要检查是否存在的 xpath 的布尔值。

于 2014-11-20T09:15:49.263 回答