2012-10-03 21 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轉儲的數組而不是第二個?我怎麼會模仿這種行爲來檢測'子類別'是否包含多個對象(就像它在第一個變量轉儲中那樣)?

基本上我試圖做的是檢測是否爲SimpleXMLElement的屬性包含多個值的數組(即如果它包含的子節點)

我已經試過各種,但我不能似乎檢測到simpleXml對象的其中一個屬性是否包含一組數組。

更新:

我發現這工作:

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謝謝,我通過在我的實際代碼中的foreach循環推送所有屬性(因此屬性),它似乎並不區分屬性和屬性,這是一個問題! – Stu

+0

@feskr var_dump($ node [「subcategory」])'outputs:'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