Intereting Posts
Нужно ли объявлять массив PHP перед использованием? Ошибка синтаксиса SQL Версия сервера MariaDB для правильного синтаксиса для использования рядом с 'WHERE ID = 4' в строке 1 Подсчитайте, как часто слово встречается в тексте в PHP php preg_grep и умлаут / акцент Переменные сеанса PHP не сохраняются с помощью ajax Как извлечь только текст из строки HTML с PHP? require_once отсутствует структура доктрины zend Мой сайт WordPress медленный из-за строки в init.php Как запрограммировать систему голосования? Пакетная обработка PHP: отправка флажков и значений радио строк таблицы вместе Объединение перекрывающихся диапазонов в массивах PHP? Есть ли способ заставить PHP постепенно выводиться по мере выполнения скрипта? Является ли foreach гарантированным итерирование в порядке массива в php? Поддерживать связь между двумя серверами php, websocket и socket.io Лучшие инструменты QA PHP

Использование xPath для доступа к значениям simpleXML

У меня есть результат 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 для приведенного выше примера.

  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 класс 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.