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 की संपत्ति अधिक मूल्यों की एक सरणी शामिल करने के लिए कोशिश कर रहा हूँ

मैं हर तरह की कोशिश की है (यानी अगर यह बच्चे नोड्स शामिल हैं), लेकिन मैं नहीं कर सकता ऐसा लगता है कि सरल एक्सएमएल ऑब्जेक्ट के गुणों में से एक में सरणी का एक सेट होता है।

अद्यतन:

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 धन्यवाद, मैं अपने वास्तविक कोड में फ़ोरैच लूप के माध्यम से सभी गुणों (और इसलिए विशेषताएँ) को दबा रहा हूं और ऐसा प्रतीत नहीं होता है गुणों और गुणों के बीच अंतर करने के लिए, जो एक समस्या है! – 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 का उपयोग कर सकते है, तो एक्सएमएल पेड़ नहीं बदलेगा:

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

है, xpath विधि मेरे विशेष परिदृश्य में काम नहीं करेगी क्योंकि उपश्रेणियां रिकर्सिव हो सकती हैं (बुरा सपना!)। हालांकि, $ डेटा विधि अच्छी तरह से अनुकूलनीय है, धन्यवाद! – 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 जैसा कि मैंने काम किया होगा अगर मैं एक्सएमएल संपादित कर सकता हूं! – Stu

संबंधित मुद्दे