2012-10-03 5 views
5

Я думаю, что я что-то действительно очевидное здесь отсутствует, но может кто-нибудь объяснить мне, почему я получаю выход я, и не выход я ожидаю на следующей вар отвалов:обнаруживая SimpleXml массив недвижимости

Вот оригинальный XML:

<result> 
    <category> 
     <id>3</id> 
     <name>Category 1</name> 
     <subcategory> 
      <id>9</id> 
      <name>SubCat 1</name> 
     </subcategory> 
     <subcategory> 
      <id>10</id> 
      <name>SubCat 2</name> 
     </subcategory> 
     <subcategory> 
      <id>11</id> 
      <name>SubCat 3</name> 
     </subcategory> 
    </category> 
</result> 

Что я делаю:

$xml = new SimpleXMLElement($file); 
foreach($xml->category as $node) 
{ 
    echo "dump 1: 
"; 
    var_dump($node); 
    echo "********************************************** 
dump 2: 
"; 
    var_dump($node->subcategory); 
    die(); 
} 

Этот выход:

dump 1: 
object(SimpleXMLElement)#130 (3) { 
    ["id"]=> 
    string(1) "3" 
    ["name"]=> 
    string(10) "Category 1" 
    ["subcategory"]=> 
    array(3) { 
     [0]=> 
     object(SimpleXMLElement)#133 (2) { 
      ["id"]=> 
      string(1) "9" 
      ["name"]=> 
      string(8) "SubCat 1" 
     } 
     [1]=> 
     object(SimpleXMLElement)#135 (2) { 
      ["id"]=> 
      string(2) "10" 
      ["name"]=> 
      string(8) "SubCat 2" 
     } 
     [2]=> 
     object(SimpleXMLElement)#136 (2) { 
      ["id"]=> 
      string(2) "11" 
      ["name"]=> 
      string(8) "SubCat 3" 
     } 
    } 
} 
********************************************** 
dump 2: 
object(SimpleXMLElement)#138 (2) { 
    ["id"]=> 
    string(1) "9" 
    ["name"]=> 
    string(8) "SubCat 1" 
} 

Первая переменная дамп выводит то, что я ожидал, но выход я ожидал бы на второй var_dump будет:

array(3) { 
    [0]=> 
    object(SimpleXMLElement)#133 (2) { 
     ["id"]=> 
     string(1) "9" 
     ["name"]=> 
     string(8) "SubCat 1" 
    } 
    [1]=> 
    object(SimpleXMLElement)#135 (2) { 
     ["id"]=> 
     string(2) "10" 
     ["name"]=> 
     string(8) "SubCat 2" 
    } 
    [2]=> 
    object(SimpleXMLElement)#136 (2) { 
     ["id"]=> 
     string(2) "11" 
     ["name"]=> 
     string(8) "SubCat 3" 
    } 
} 

или даже объект, содержащий все элементы массива. Почему это не так?

Я вижу, когда я вызываю var_dump($node->subcategory), он сбрасывает первый найденный узел «подкатегории», но почему же он передает все узлы «подкатегории» в массив для первого дампа var, но не для второго? И как бы я воспроизвел это поведение, чтобы определить, содержит ли «подкатегория» более одного объекта (как в первом дампе var)?

В основном то, что я пытаюсь сделать, это обнаружить, если свойство SimpleXMLElement содержит массив несколько значений (например, если он содержит дочерние узлы)

Я пробовал всякие, но я не могу похоже, обнаруживают, что одно из свойств объекта simpleXml содержит набор массивов.

Update:

Я нашел это работает:

if(count($node->subcategory)>1) 
{ 
    // we have more than one subcategory 
} 

Но это не самый изящный способ, я уверен, что там должен быть чище метод?

+0

ответ на этот пост может помогите вам: http://stackoverflow.com/questions/2751711/php-get-values-from-simplexmlelement-array?rq = 1 ** var_dump ($ node ["subcategoy"]); ** – feskr

+0

@feskr thanks, я нажимаю все свойства (и, следовательно, атрибуты) через цикл foreach в своем действительном коде, и это не кажется различать атрибуты и свойства, что является проблемой! – Stu

+0

@feskr 'var_dump ($ node [" subcategory "])' выходы: 'NULL' – Stu

ответ

1

Это свойство является объектом iterarator:

$node->subcategory 

И если вам нужно получить все элементы попробовать:

foreach($xml->category as $node) 
{ 
... 
    foreach($node->subcategory as $subcategory) 
    { 
    $data[] = (array) $subcategory 
    } 
... 
} 

Если вам нужно знать кол-подкатегорий деталей вы успешно использовали счета-метод ,

И вы можете использовать XPath, если не изменится XML дерево:

$categories = $xml->xpath('/category/subcategory'); 
var_dump($categories) 
+0

Метод xpath не будет работать в моем конкретном сценарии, поскольку подкатегории могут быть рекурсивными (кошмар!). Однако метод $ data хорошо адаптируется, спасибо! – Stu

1

Настройте файл XML:

<result> 
    <category> 
     <id>3</id> 
     <name>Category 1</name> 
     <subcategories> 
      <subcategory> 
      <id>9</id> 
      <name>SubCat 1</name> 
      </subcategory> 
      <subcategory> 
      <id>10</id> 
      <name>SubCat 2</name> 
      </subcategory> 
      <subcategory> 
      <id>11</id> 
      <name>SubCat 3</name> 
      </subcategory> 
     </subcategories> 
    </category> 
</result> 

И попробуйте:

var_dump($node->subcategories); 
+0

пример из php.net: http://www.php.net/manual/en/simplexml.examples-basic.php – feskr

+0

Спасибо, что бы работать только я не могу изменить файл XML, к сожалению! – Stu

+0

+1 как это сработало бы, если бы я мог редактировать xml! – Stu

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