2008-10-10 11 views
28

मेरे पास एक डीओएम दस्तावेज़, में लोड की गई एक एक्सएमएल फ़ाइल है, मैं सभी 'foo' टैग के माध्यम से पुन: प्रयास करना चाहता हूं, इसके नीचे प्रत्येक टैग से मूल्य प्राप्त करना चाहता हूं। मुझे लगता है मैं के माध्यम सेमैं PHP में डोम तत्वों के माध्यम से कैसे पुन: प्रयास करूं?

$element = $dom->getElementsByTagName('foo')->item(0); 
foreach($element->childNodes as $node){ 
    $data[$node->nodeName] = $node->nodeValue; 
} 

हालांकि, मैं क्या करने की कोशिश कर रहा हूँ मान प्राप्त कर सकते पता है, की तरह एक एक्सएमएल से है, हर foo टैग पर

<stuff> 
    <foo> 
    <bar></bar> 
     <value/> 
    <pub></pub> 
    </foo> 
    <foo> 
    <bar></bar> 
    <pub></pub> 
    </foo> 
    <foo> 
    <bar></bar> 
    <pub></pub> 
    </foo> 
    </stuff> 

पुनरावृति, और विशिष्ट बार मिलता है या पब, और वहां से मूल्य प्राप्त करें। अब, मैं foo पर फिर से कैसे सक्रिय करूं ताकि मैं अभी भी नाम से विशिष्ट बाल नोड्स तक पहुंच सकूं?

उत्तर

41

जांची नहीं है, लेकिन क्या बारे में:

$elements = $dom->getElementsByTagName('foo'); 
$data = array(); 
foreach($elements as $node){ 
    foreach($node->childNodes as $child) { 
     $data[] = array($child->nodeName => $child->nodeValue); 
    } 
} 
+1

$ elementCount के लिए कोई ज़रूरत नहीं। बस इस तरह के $ डेटा में संलग्न करें: $ डेटा [] = सरणी ($ child-> nodeName => $ child-> nodeValue); – troelskn

+1

यह चाल है! मैं बहुत जटिल सोच रहा था। थक गया होगा। – Esa

+0

troelskn से टिप्पणी के आधार पर कोड अपडेट किया गया है, क्या आपका मतलब था? – roryf

4

यह आम तौर पर काफी बेहतर की तुलना में यह कोड है कि दस्तावेज़ की संरचना का ज्ञान पर निर्भर करता है लिखना है XPath का उपयोग करने के एक दस्तावेज क्वेरी करने के लिए है। दो कारण हैं। सबसे पहले, परीक्षण और डीबग करने के लिए बहुत कम कोड है। दूसरा, यदि दस्तावेज़ की संरचना में परिवर्तन होता है तो कोड के समूह को बदलने के बजाय XPath क्वेरी को बदलना बहुत आसान होता है।

बेशक, आपको XPath सीखना है, लेकिन (अधिकांश) XPath रॉकेट विज्ञान नहीं है।

PHP का डोम XPath क्वेरी करने के लिए xpath_eval विधि का उपयोग करता है। यह here दस्तावेज है, और उपयोगकर्ता नोट्स में कुछ अच्छे अच्छे उदाहरण शामिल हैं।

1

यह करने के लिए यहां एक और (आलसी) तरीका है।

$data[][$node->nodeName] = $node->nodeValue; 
0

FluidXML के साथ आप एक्सएमएल को बहुत आसानी से क्वेरी और पुन: सक्रिय कर सकते हैं।

$data = []; 

$store_child = function($i, $fooChild) use (&$data) { 
    $data[] = [ $fooChild->nodeName => $fooChild->nodeValue ]; 
}; 

fluidxml($dom)->query('//foo/*')->each($store_child); 

https://github.com/servo-php/fluidxml

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

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