使用xPath访问simpleXML的值 - php

我的数据库中包含设置的XML对象结果。

我正在尝试访问特定settingName的值:

    SimpleXMLElement Object
(
[settings] => Array
    (
        [0] => SimpleXMLElement Object
            (
                [settingName] => Test
                [settingDescription] => Testing
                [requireValue] => 1
                [localeID] => 14
                [status] => 1
                [value] => 66
                [settingID] => 5
            )

        [1] => SimpleXMLElement Object
            (
                [settingName] => Home Page Stats
                [settingDescription] => Show the Top 5 Teammate / Teamleader stats?
                [requireValue] => 0
                [localeID] => 14
                [status] => 0
                [value] => SimpleXMLElement Object
                    (
                    )

                [settingID] => 3
            )

    )

我尝试使用xPath并到目前为止:

$value = $fetchSettings->xpath("//settingName[text()='Test']/../value");

返回:

Array ( [0] => SimpleXMLElement Object ( [0] => 66 ) )

如何获得实际值,而不仅仅是另一个数组/对象?

对于上面的示例,最终结果将仅为66

参考方案

SimpleXMLElement::xpath()返回“搜索结果”的纯PHP数组;如果找到任何结果,则第一个结果将始终是索引0
每个“搜索结果”都是一个SimpleXMLElement对象,该对象具有一种神奇的__toString()方法,用于获取节点的直接文本内容(包括CDATA,但包括子节点内的文本,等等)。调用它的最简单方法是使用(string)$my_element;。 (int)$my_element也会调用它,然后将结果转换为整数。

所以:

 $xpath_results = $fetchSettings->xpath("//settingName[text()='Test']/../value");
 if ( count($xpath_results) > 0 ) {
      $value = (string)$xpath_results[0];
 }

另外,由于DOM的对象模型更丰富,the DOMXPath class可以返回元素和属性节点以外的结果。例如,您可以有一个以//text()结尾的XPath表达式来引用节点的文本内容,而不是节点本身(SimpleXML会进行搜索,但是仍然会提供一个元素对象)。

缺点是使用起来比较冗长,但是幸运的是,您可以混合使用两组函数(使用dom_import_simplexml()及其对应函数),因为它们具有相同的基础表示形式:

 // WARNING: Untested code. Please comment or edit if you find a bug!
 $fetchSettings_dom = dom_import_simplexml($fetchSettings);
 $xpath = new DOMXPath($fetchSettings_dom->ownerDocument);
 $value = $xpath->evaluate(
      "//settingName[text()='Test']/../value/text()",
      $fetchSettings_dom
 );

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP:填写数组中的“空白” - php

我有一个php数组(通过表单中的复选框值获取-您知道复选框仅在未设置时显示在_POST变量中)。Array ( [2] => 0,2 [3] => 0,3 ) 我需要一种方法来“填补” 0-5之间的差距。所以上面看起来像(用'-1'填充空白。我尝试用填充有'-1'的数组array_merge(),但这没用。Array ( [0] => -1…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

在xPath中的innerHTML? - php

有没有一种方法可以检索div元素中包含的HTML(和JavaScript)? 参考方案 我不是PHP开发人员,但发现了这一点:function getNodeInnerHTML(DOMNode $oNode) { $oDom = new DOMDocument(); foreach($oNode->childNode as $oChild) { $oD…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…