使用xPath访问simpleXML的值

时间:2014-07-29 21:15:58

标签: php xml xpath simplexml

我的数据库包含设置的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

3 个答案:

答案 0 :(得分:2)

因为XML文件中的每个元素都可以多次出现,所以解析器总是返回一个数组。如果您确定,它只是一个项目,您可以使用current()

echo (string) current($value);

请注意,我将SimpleXMLElement转换为字符串(请参阅http://php.net/manual/simplexmlelement.tostring.php)以获取实际值。

答案 1 :(得分:2)

  1. SimpleXMLElement::xpath()返回一个简单的PHP数组"搜索结果&#34 ;;如果找到任何结果,第一个结果将始终为索引0
  2. 每个"搜索结果"是一个SimpleXMLElement对象,它有一个魔术__toString()方法来获取节点的直接文本内容(包括CDATA,但包括子节点内的文本等)。调用它的最简单方法是使用(string)$my_element; (int)$my_element也会调用它,然后将结果转换为整数。
  3. 所以:

     $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
     );
    

答案 2 :(得分:0)

请改用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获取值。