Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Получить содержимое элемента по его атрибуту
Форумы портала PHP.SU » » XML и его обработка » Получить содержимое элемента по его атрибуту

Страниц (1): [1]
 

1. perezzloy - 04 Апреля, 2014 - 17:56:03 - перейти к сообщению
Есть xml-файл:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <razdel_list>
  2.         <razdel id="1" name="Имя первого раздела">
  3.                 <about>Описание первого раздела</about>
  4.         </razdel>
  5.         <razdel id="2" name="Имя второго раздела">
  6.                 <about>Описание второго раздела</about>
  7.         </razdel>
  8. </razdel_list>

Мне надо написать функцию, которая принимала бы id раздела, а возвращала бы массив с именем этого раздела и описанием.
Наверное это совсем не сложно, но я раньше не сталкивался с xml и поэтому туплю. Читал, искал, все равно не пойму. Подскажите, пожалуйста, как реализовать это?
Лучше через SimpleXML, эта либа мне показалась более простой.
2. perezzloy - 04 Апреля, 2014 - 20:02:44 - перейти к сообщению
Ну или как вариант можно так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <razdel_list>
  2.         <razdel>
  3.                 <id>1</id>
  4.                 <name>Раздел 1</name>
  5.                 <about>Описание раздела 1</about>
  6.         </razdel>
  7.         <razdel>
  8.                 <id>2</id>
  9.                 <name>Раздел 2</name>
  10.                 <about>Описание раздела 2</about>
  11.         </razdel>
  12. </razdel_list>

Тогда как мне по <id> получить <name> и <about> родительского элемента, то есть <razdel>? И тут важно, что php функция должна принимать id и возвращать значения <name> и <about> в одном массиве.
3. armancho7777777 - 05 Апреля, 2014 - 04:11:59 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class MyXML {
  2.  
  3.     private $_sXML = '';
  4.  
  5.     /**
  6.      * @var SimpleXMLElement
  7.      */
  8.     private $_rXML = null;
  9.  
  10.     /**
  11.      * @param string $sXML
  12.      */
  13.     public function __construct($sXML) {
  14.         $this->_sXML = trim($sXML);
  15.         $this->_rXML = simplexml_load_string($this->_sXML);
  16.     }
  17.  
  18.     /**
  19.      * @param int|string $id
  20.      * @return SimpleXMLElement|stdClass
  21.      */
  22.     public function getDataByID($id)
  23.     {
  24.         $query = '(//razdel[./id = ' . $id . '])[1]';
  25.         $data = $this->_rXML->xpath($query);
  26.  
  27.         if(count($data)) {
  28.             return $data[0];
  29.         }
  30.  
  31.         return new stdClass();
  32.     }
  33. }
  34.  
  35. $xml = new MyXML('
  36.    <razdel_list>
  37.            <razdel>
  38.                    <id>1</id>
  39.                    <name>Раздел 1</name>
  40.                    <about>Описание раздела 1</about>
  41.            </razdel>
  42.            <razdel>
  43.                    <id>2</id>
  44.                    <name>Раздел 2</name>
  45.                    <about>Описание раздела 2</about>
  46.            </razdel>
  47.    </razdel_list>
  48. ');
  49.  
  50. echo $xml->getDataByID(2)->about;
4. perezzloy - 05 Апреля, 2014 - 15:14:59 - перейти к сообщению
armancho7777777 пишет:
PHP:
скопировать код в буфер обмена
  1. class MyXML {
  2.  
  3.     private $_sXML = '';
  4.  
  5.     /**
  6.      * @var SimpleXMLElement
  7.      */
  8.     private $_rXML = null;
  9.  
  10.     /**
  11.      * @param string $sXML
  12.      */
  13.     public function __construct($sXML) {
  14.         $this->_sXML = trim($sXML);
  15.         $this->_rXML = simplexml_load_string($this->_sXML);
  16.     }
  17.  
  18.     /**
  19.      * @param int|string $id
  20.      * @return SimpleXMLElement|stdClass
  21.      */
  22.     public function getDataByID($id)
  23.     {
  24.         $query = '(//razdel[./id = ' . $id . '])[1]';
  25.         $data = $this->_rXML->xpath($query);
  26.  
  27.         if(count($data)) {
  28.             return $data[0];
  29.         }
  30.  
  31.         return new stdClass();
  32.     }
  33. }
  34.  
  35. $xml = new MyXML('
  36.    <razdel_list>
  37.            <razdel>
  38.                    <id>1</id>
  39.                    <name>Раздел 1</name>
  40.                    <about>Описание раздела 1</about>
  41.            </razdel>
  42.            <razdel>
  43.                    <id>2</id>
  44.                    <name>Раздел 2</name>
  45.                    <about>Описание раздела 2</about>
  46.            </razdel>
  47.    </razdel_list>
  48. ');
  49.  
  50. echo $xml->getDataByID(2)->about;

Спасибо огромное, это именно то, что надо! Теперь стало гораздо понятнее как действовать. Улыбка
5. armancho7777777 - 05 Апреля, 2014 - 15:51:41 - перейти к сообщению
Да не за что )

 

Powered by ExBB FM 1.0 RC1