У меня есть результат XML-объекта из моей базы данных, содержащий настройки.
Я пытаюсь получить доступ к значениям для определенного параметраName:
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
класс 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 );
Поскольку каждый элемент в 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.