2012-10-03 17 views
5

Buraya gerçekten belirgin bir şey eksik düşünüyorum, ama ben çıkışını değil, ben şu var üzerinde beklemek çıktı alıyorum neden birisi bana açıklayabilir döker:Tespit SimpleXML dizi özellik

İşte orijinal 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> 

ben yapıyorum:

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

Bu çıkışlar:

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" 
} 

ilk var dökümü ne beklenir verir ama ikinci var_dump için beklediğiniz çıkışı olacaktır:

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" 
    } 
} 

Ya da tüm dizi öğelerini içeren hatta bir nesne. Neden böyle değil?

var_dump($node->subcategory)'u bulduğumda, bulduğu ilk 'alt kategori' düğümünü boşa harcadığını görebiliyorum, ancak neden tüm "alt kategori" düğümlerini ilk var dökümü için bir diziye dönüştürüyor, ancak ikinci için değil? Ve 'alt kategorinin' birden fazla nesne içerip içermediğini (ilk var dökümünde olduğu gibi) tespit etmek için bu davranışı nasıl taklit edebilirim?

Temelde ne SimpleXMLElement bir özelliği daha değer dizisi içeriyorsa algılamak olduğunu yapmaya çalışıyorum ben her türlü denedim

(yani çocuğun düğümleri içeriyorsa), ama yapamıyorum simpleXml nesnesinin özelliklerinden birinin bir dizi diziyi içerip içermediğini algılar gibi görünüyor.

Güncelleme: Temiz bir yöntem olmalıdır eminim

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

Ama en zarif yolu değil:

umarım bu işe bulundu?

+0

Bu yayına verilen cevap olabilir size yardımcı olur: http://stackoverflow.com/questions/2751711/php-get-values-from-simplexmlelement-array?rq = 1 ** var_dump ($ node ["subcategoy"]); ** – feskr

+0

@feskr Teşekkürler, tüm özellikleri (ve dolayısıyla özniteliklerini) gerçek kodumdaki bir foreach döngüsünden geçiriyorum ve görünmüyor öznitelikler ve özellikler arasındaki farkı ayırt etmek, bir problem! – Stu

+0

@feskr 'var_dump ($ node [" alt kategori "])' çıktılar: 'NULL' – Stu

cevap

1

Bu özellik iterarator amacıdır:

$node->subcategory 

Ve almak gerekiyorsa tüm öğeleri deneyin: Eğer alt kategori öğe sayısını bilmeniz gerekiyorsa

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

başarıyla sayım-yöntemi kullanmış .

Ve XML ağacını değişmeyecek eğer xpath kullanabilirsiniz:

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

cevabınız için başka bir tane var, alt kategoriler özyinelemeli olarak xpath yöntemi benim senaryoda çalışmaz (kâbus!). Ancak, $ veri yöntemi güzel uyarlanabilir, teşekkürler! Php.net sitesinden – Stu

1

xml dosyanızı ayarlama:

<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> 

Ve deneyin:

var_dump($node->subcategories); 
+0

örneği: http://www.php.net/manual/en/simplexml.examples-basic.php – feskr

+0

Teşekkürler, bu sadece XML dosyasını ne yazık ki değiştiremiyorum! – Stu

+0

+1, xml dosyasını düzenleyebilirsem çalışacaktı! – Stu