使用XPath访问的SimpleXML的值(Using xPath to access values

2019-10-20 13:31发布

我从包含数据库设置的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为上面的例子。

Answer 1:

  1. SimpleXMLElement::xpath()返回“的搜索结果”纯PHP阵列; 第一个结果将始终是指数0 ,如果发现任何结果
  2. 每个“搜索结果”是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];
 }

可替代地, 所述DOMXPath类可以返回比元件的其他结果和属性节点,由于DOM的更丰富的对象模型。 例如,你可以有一个XPath表达式结束//text()是指一个节点的文本内容,而不是节点本身(的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
 );


Answer 2:

因为在一个XML文件的每个元素可以显示为多次解析器总是返回一个数组。 如果你是肯定的,那它只是一个单一的项目,你可以使用current()

echo (string) current($value);

请注意,我投了SimpleXMLElement为字符串(见http://php.net/manual/simplexmlelement.tostring.php )获得的实际值。



Answer 3:

使用DomXPath类代替。 http://php.net/manual/en/domxpath.evaluate.php从php.net样品只是相当于你想达到什么样的:

<?php
$doc = new DOMDocument;
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
$tbody = $doc->getElementsByTagName('tbody')->item(0);
// our query is relative to the tbody node
$query = 'count(row/entry[. = "en"])';
$entries = $xpath->evaluate($query, $tbody);
echo "There are $entries english books\n";

通过这种方式,你可以直接从XML获取值。



文章来源: Using xPath to access values of simpleXML