我有一个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];
}
或者,DOMXPath
类可以返回元素和属性节点以外的结果,因为DOM的对象模型更丰富。例如,您可以使用以//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
);
因为xml文件中的每个元素都可以多次出现,所以解析器总是返回一个数组。如果你确定只有一个项目,你可以使用current()
echo (string) current($value);
注意,我将SimpleXMLElement
转换为字符串(参见http://php.net/manual/simplexmlelement.tostring.php)以获得实际值。
使用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中获取值。