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

Posted

技术标签:

【中文标题】如何使用 XPath 检查 <Success /> 节点是不是存在【英文标题】:How to use XPath to check if <Success /> node exists如何使用 XPath 检查 <Success /> 节点是否存在 【发布时间】:2012-08-30 15:14:55 【问题描述】:

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

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

你可以看到没有起始标签&lt;Success&gt;那么我如何使用Xpath搜索&lt;Success /&gt;的存在?

谢谢 西蒙

【问题讨论】:

正常的方式,你尝试了什么? 【参考方案1】:

&lt;Success /&gt; 元素是一个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

demo


当然,你也可以只查询/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);

demo


你也可以使用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

【讨论】:

感谢您的详细回复。非常感谢。【参考方案2】:

语法:

<Success />

是exactly equivalent到

<Success></Success>

为了测试&lt;Success /&gt;的存在,你只需使用这样的路径:

//OTA_PingRS/Success[1]

您现在可以测试结果是否为空。如果是,则 &lt;Success /&gt; 元素不存在。

【讨论】:

感谢您的回复,这帮助我更好地理解了 xpath 和 simplexml 如何处理 XML 数据。【参考方案3】:

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

【讨论】:

以上是关于如何使用 XPath 检查 <Success /> 节点是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

使用XPath获取带有span的段落的完整文本

如何使用 BS4 和 LXML 获取 xpath

如何编写 XPath 查询来匹配两个属性?

如何找到xpath表单网页

XPath 查找节点是不是存在

如何使用 XPath 和 Java 更新 XML