php

2009-06-15 20 views
10

में डोमनेड से डोमेलेमेंट में बच्चे 0 तत्व पर getElementsByTagName() जैसी विधियों तक पहुंचने के लिए ऑब्जेक्ट को getElementsByTagName() पर DOMElement पर कनवर्ट करना चाहते हैं। किसी भी अन्य भाषा में, मैं कास्ट करूंगा और यह आसान होगा, लेकिन कुछ तेज़ी से देखने के बाद, PHP में ऑब्जेक्ट कास्टिंग नहीं है। तो मुझे यह जानने की ज़रूरत है कि ऑब्जेक्ट को DOMNode ऑब्जेक्ट से कैसे प्राप्त करें।php

+0

क्या आपने जांच की है कि getElementsByTagName() वास्तव में कुछ (जैसे आइटम आइटम उदाहरण) के साथ डोमेलेमेंट ऑब्जेक्ट देता है? यदि आपको इसे कास्ट करने की आवश्यकता नहीं है, तो आप केवल $ आइटम का उपयोग कर सकते हैं जैसे कि एक DOMElement – rojoca

+0

getElementsByTagName() एक DOMNodeList देता है, मुझे लगता है कि एक DOMNodeList DOMNode की एक सूची थी। कारण मैंने सोचा था कि आपको कास्ट करना था क्योंकि मुझे जावा में डालना पड़ा जब मैं एक ही प्रक्रिया करना चाहता था। – Samuel

+1

मजाकिया बात यह है कि getElementById DOMElement देता है लेकिन getElementsByTagName एक सूची देता है जहां प्रत्येक आइटम डोमनोड है !! – Andrew

उत्तर

15

तुम कुछ भी कास्ट करने के लिए, बस विधि कॉल की जरूरत नहीं है:

$links = $dom->getElementsByTagName('a'); 

foreach ($links as $link) { 
    $spans = $link->getElementsByTagName('span'); 
} 

और वैसे, DOMElementDOMNode का एक उपवर्ग है। यदि आप एक DOMNodeList के बारे में बात कर रहे थे, तो इस तरह के एक सूची में तत्वों तक पहुँचने किया जा सकता है, हो सकता है या तो एक foreach() पाश के साथ ऊपर प्रस्तुत, विधि, या तो DOMNodeList की item() विधि का उपयोग कर:

$link_0 = $dom->getElementsByTagName('a')->item(0); 
+0

क्या कोई DOMNodeList कभी एक डोमोडोड लौटाता है जो डोमेलेमेंट नहीं है? [दस्तावेज़] (http://us3.php.net/manual/en/class.domnodelist.php) बस डोमोडेड कहें और डोमेलेमेंट का उल्लेख न करें। उदाहरण के लिए, यदि DOMNodeList [DOMXPath :: क्वेरी] (http://us2.php.net/manual/en/domxpath.query.php) से आता है तो क्या होगा? – paulie4

+0

@ user2016290 हाँ, 'DOMXPath :: क्वेरी' या यहां तक ​​कि 'DOMNode :: childNodes'। https://gist.github.com/igstan/9654eca0db804c8e87bd –

+0

डोमेलेमेंट में अतिरिक्त विधियां हैं, जो डोमोडोड में उपलब्ध नहीं हैं। उदाहरण के लिए getAttribute()।और यद्यपि यदि आप इस विधि का उपयोग डोमोडोड पर करते हैं, तो यह PHP में काम करेगा, यह आपके आईडीई के साथ काम नहीं करेगा (पॉप-अप विधियों की सूची में उपलब्ध नहीं है)। तो सवाल खड़ा है: GetElementsByTagName – Andrew

1

आपके पास किसी भी स्पष्ट टाइपकास्टिंग को करने की आवश्यकता नहीं है, बस जांचें कि क्या आपके DOMNode ऑब्जेक्ट में XML_ELEMENT_NODE का नोड टाइप है।

PHP इस से पूरी तरह से खुश होगा।

यदि आप अपने कोड को देखने के लिए PHPLint का उपयोग करते हैं तो आप देखेंगे कि PHPLint DOMNode ऑब्जेक्ट पर getElementsByTagName का उपयोग करने के बारे में शिकायत करता है। चारों ओर इस आप निम्नलिखित घेरा के माध्यम से कूद करने की जरूरत है पाने के लिए:

/*.object.*/ $obj = $node; 
$element = /*.(DOMElement).*/ $obj; 

तो फिर तुम सही प्रकार की एक $ तत्व चर और PHPLint से कोई शिकायत नहीं होगा।

0

मुझे पता है कि यह ज्यादातर एक परेशान आईडीई समस्या है।

कारण $DOMNodeList->item(0) चुड़ैल एक डोमोडोड लौटाता है (या कम से कम आईडीई ऐसा सोचता है)।

इसे ठीक करने के लिए आपको $DOMDocument->getElementsByTagName($tagName)->item($index) को अपने तरीके से निकालना होगा। DOCBlock में आप @return कथन को DOMElement चुड़ैल पर सेट करते हैं, निरीक्षण समस्या को हल करता है।

यह कम से कम PHPStorm में काम करता है।

0

आईडीई चेतावनी को कम करने के लिए मैं अपने प्रोजेक्ट में यही उपयोग करता हूं।

/** 
* Cast a DOMNode into a DOMElement 
*/ 
    function cast_e(DOMNode $node) : DOMElement { 
    if ($node) { 
     if ($node->nodeType === XML_ELEMENT_NODE) { 
      return $node; 
     } 
    } 
    return null; 
} 
संबंधित मुद्दे