आपके पास कई प्रश्न हैं। मैं क्या समझ वे दस्तावेज़ परिभाषाओं की तरह काम करते हैं, और कुछ XML तत्वों की पहचान करने के लिए आवश्यक हैं से
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
: मैं एक एक करके उन्हें एक समाधान करने के लिए कोशिश करेंगे।
हां, जब भी आपके पास नामस्थान के साथ एक XML दस्तावेज़ होता है, तो प्रत्येक तत्व इसके स्वयं के नामस्थान में हो सकता है।
यदि आप अपने नामस्थान में तत्वों का उपयोग करना चाहते हैं, तो हाँ, आपको उन्हें पहचानने के लिए नामस्थान की आवश्यकता है। जैसे एक्सपैथ अभिव्यक्ति के भीतर।
PHP एक्सएमएल नेमस्पेस में DOMDocument और अन्य libxml आधारित XML एक्सटेंशन द्वारा समर्थित हैं।
क्या PHP वास्तव में उस यूआरएल के लिए अनुरोध करता है और यह सत्यापित करता है कि तत्व दस्तावेज़ परिभाषा में मौजूद है या नहीं?
नहीं है, कोड-उदाहरण के लिए आप दे:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
पीएचपी नहीं अनुरोध करेंगे कि यूआरएल। आपने पहले ही देखा है कि यूआरएल खाली है/404 देता है ताकि आप समझ सकें कि यह सब क्या है। वास्तव में वह यूआरएल एक यूआरआई है। यह अंतर है और पहचानकर्ता और लोकेटर।
काम कर एक्सएमएल नामस्थान, कुछ भी स्थित होने की जरूरत है करने के लिए। नामस्थान केवल पहचानने की जरूरत है। इसलिए किसी भी यूआरआई के साथ एक वैध एक्सएमएल नेमस्पेस का प्रतिनिधित्व किया जा सकता है। उदाहरण के लिए, fantasy:space
एक मान्य यूआरआई है और एक्सएमएल नेमस्पेस निर्दिष्ट करने के लिए आवश्यकताओं को पूरी तरह अर्हता प्राप्त करता है। लेकिन जब आप इसे अपने ब्राउज़र में दर्ज करते हैं तो आपको कोई भी सर्वर-प्रतिक्रिया वापस नहीं मिलेगी (आपका ब्राउज़र नहीं जानता कि "फंतासी" क्या है)।
$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)');
कारण है कि आप एक खाली स्ट्रिंग यहाँ प्राप्त कर एक अलग से एक है:
तो 404 आप प्राप्त कारण है कि स्लेश अपने Xpath मूल्यांकन के साथ रिक्त है नहीं है। एक्सपैथ अभिव्यक्ति देखें:
string(//atom:entry[3]/slash:comments)
वह नोड-सेट के स्ट्रिंग मान के लिए पूछ रहा है। आपने निर्दिष्ट किया है नोड सेट के रूप में:
//atom:entry[3]/slash:comments
Getting a string of a nodeset पीएचपी DOMDocument में अर्थ है:
एक नोड सेट नोड सेट में पहला है कि में string-value of the node वापस लौट कर एक स्ट्रिंग में बदल जाती है दस्तावेज़ आदेश। यदि नोड-सेट खाली है, तो खाली स्ट्रिंग लौटा दी जाती है।
नोड के रूप में एक तत्व है, the element node की स्ट्रिंग-मूल्य का मतलब है:
एक तत्व नोड के स्ट्रिंग मान की सभी पाठ नोड वंश के स्ट्रिंग-मूल्यों के संयोजन है दस्तावेज़ आदेश में तत्व नोड।
तो यहां दो स्पष्टीकरण हैं कि आपको खाली स्ट्रिंग क्यों मिलती है: या तो नोड-सेट खाली है या तत्व स्ट्रिंग-वैल्यू केवल खाली स्ट्रिंग है।
आप जल्दी से अंदर नोड्स की संख्या के बारे में सीख सकते हैं एक नोड-सेट count()
function का उपयोग करके:
$result = $xpath->evaluate('count(//atom:entry[3]/slash:comments)');
कौन सा तो आप एक बेहतर विचार है जो दो मामलों के मामले है देना चाहिए। चूंकि आपने स्रोत एक्सएमएल साझा नहीं किया है, इसे क्यों नहीं कहा जा सकता है विशेष रूप से हालांकि - जैसा कि मुझे लगता है - इसमें कोई नोड नहीं है। स्रोत को देखना इसे आसानी से स्पष्ट करना चाहिए।
तब तक, मैं केवल अनुमान लगा सकता हूं कि आप शायद एक आरएसएस 2 फीड पार्स कर रहे हैं जिसमें <atom:entry>
तत्व नहीं हैं लेकिन केवल <item>
तत्व हैं। मेरा उदाहरण देखें:
$feed = 'http://hakre.wordpress.com/feed/';
$doc = new DOMDocument();
$doc->load($feed);
$xpath = new DOMXPath($doc);
echo $xpath->evaluate('string(//item[3]/slash:comments)'); # 1
यह मूल्य "1" को तीसरे आइटम के लिए टिप्पणी गणना के रूप में आउटपुट करता है। यह एक मानक वर्डप्रेस ब्लॉग की फ़ीड है। I have put this online as an interactive example, so you can see it in action and enter your feed URL।
Btw: आप आप XML लोड करने के बाद DOMXPath
वस्तु बनाते हैं, तो आप जब तक कि आप जानते हैं जो उपसर्गों दस्तावेज़ में उपयोग किया जाता है नाम स्थान-यूआरआई रजिस्टर करने की आवश्यकता नहीं है। यही कारण है कि उदाहरण में मैं कोई नेमस्पेस-यूआरआई पंजीकृत नहीं करता हूं।
यह एक खाली DOMNodeList देता है ... –