2014-10-13 4 views
1
SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [domain] => http://www.eatingwell.com/category/publication/magazine /september/october_2009 
     ) 

    [0] => September/October 2009 
    [1] => American 
    [2] => Easy 
    [3] => Diabetes appropriate 
    [4] => Healthy weight 
    [5] => High calcium 
    [6] => Low calorie 
    [7] => Low cholesterol 
    [8] => Bone Health 
    [9] => Super Bowl 
    [10] => Recipes & Menus - Fresh 
    [11] => Recipes & Menus - Vegetarian 
    [12] => Cheese 
    [13] => Dairy 
    [14] => Greens 
    [15] => Vegetables 
    [16] => Wheat 
    [17] => Whole Grains 
    [18] => Vegetarian, other 
    [19] => Appetizers 
    [20] => Dinner
 
    [21] => Bake 
    [22] => Fall 
    [23] => Spring 
    [24] => Summer 
    [25] => Winter 
    [26] => Budget 
    [27] => Entertaining, casual 
    [28] => Everyday favorites 
    [29] => Quick (total 30 min. or less) 
    [30] => Vegetarian 
    [31] => Appetizer 
    [32] => Main dish, vegetarian 
    [33] => Pizza 
) 

Я хочу извлечь эту категорию из RSS-канал, но $bullet =$item->category;pr($bullet); это отобразить результат, полученный выше. Я хочу только значение массива [0] - [33]. Как удалить атрибуты @attributes сверху?Как удалить [@attributes] в SimpleXMLElement Объект

ответ

-1

По наблюдениям IMSoP, @attributes не является реальным свойством этого объекта. Тем не менее, вы можете «обмануть», делая что-то вроде следующего, до тех пор, пока вы не должны взаимодействовать с объектом, как объект а SimpleXMLElement больше:

<?php 

function purgeAttributes($object) { 
    foreach ($object as $key => $value) { 
     if (gettype($value) == 'object') { 
      $object->$key = purgeAttributes($value); 
     } 

     if ($key == '@attributes') { 
      unset($object->$key); 
     } 
    } 

    return $object; 
} 

$x = SimpleXML_load_string('<foo bar="baz" />'); 

$x = json_decode(json_encode($x)); 

$x = purgeAttributes($x); 

var_dump($x); 
+0

Это не будет работать (тест для себя: http://3v4l.org/a6MFh) и ни будет что-то подобное, потому что это свойство фактически не существует, именно так print_r пытается показать вам, что содержит узел XML. – IMSoP

+0

Хорошо. Это, тогда: http://3v4l.org/6saf5 – Uthr

+0

ОК, конечно, вы можете превратить полезный объект в бесполезный stdClass, а затем манипулировать им. Умный, если не бессмысленный ИМХО: предпосылка вопроса та же ошибка, что и вы, атрибуты будут отображаться как нормальное свойство. Вероятно, вы должны отредактировать свой ответ с рабочим кодом. – IMSoP

0

Я предполагаю pr() это функция, которая просто оборачивает print_r() по какой-либо причине, и в этом случае я расскажу вам, что я говорю всем с вопросами SimpleXML: не доверяют print_r (или var_dump, или любые обычные функции вывода отладки).

Простая истина Эти свойства не существуют. SimpleXML использует итераторы, магические методы и другие трюки, чтобы дать невероятно удобный интерфейс «Do What I Mean», но очень сложно суммировать это в отладочном выпуске.

Если вы хотите перебрать все элементы с тем же именем, напишите foreach ($item->category as $bullet), и вы никогда не найдете $bullet, если у вас установлены какие-либо атрибуты. Он будет установлен для объекта для каждого узла, хотя, поэтому, если вы делаете что-то более сложное, чем echo $bullet, вы, вероятно, захотите извлечь текстовый контент (string)$bullet.

Если вы хотите получить атрибут, вы не найдете его, посмотрев на @attributes в любой форме, но используя доступ в виде массива, например. (string)$bullet['domain'].

Базовый код на the examples in the manual, а не выход отладки, и вы получите гораздо дальше :)

Смежные вопросы