2012-10-03 22 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