2012-11-04 11 views
5
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/'); 

जो मैं समझता हूं उससे वे दस्तावेज़ परिभाषाओं की तरह कार्य करते हैं, और कुछ एक्सएमएल तत्वों की पहचान करने की आवश्यकता होती है।के लिए DomDocument नामस्थान क्या हैं?

क्या PHP वास्तव में उस यूआरएल के लिए अनुरोध करता है और यह सत्यापित करता है कि तत्व दस्तावेज़ परिभाषा में मौजूद है या नहीं?

क्योंकि उस URL को इस, कारण है कि मैं एक खाली स्ट्रिंग प्राप्त हो सकता है एक आरएसएस फ़ीड से <slash> तत्व का मान प्राप्त करने का प्रयास करते समय एक 404 not found पेज :(

$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)'); 

पता चलता है?

उत्तर

5
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/'); 

देखते हैं।

क्या PHP वास्तव में उस यूआरएल के लिए अनुरोध करता है और यह सत्यापित करता है कि तत्व दस्तावेज़ परिभाषा में मौजूद है या नहीं?

सं
URI को दिखाता है कि एक XML namespace, कि एक XML शब्दावली का प्रतिनिधित्व करता है। इस तरह के नेमस्पेस को अलग-अलग अर्थों के साथ एक ही शब्द का उपयोग करके विभिन्न संदर्भों का सामना करने के लिए डिज़ाइन किया गया है। नेमस्पेस के साथ, एक एक्सएमएल फ़ाइल में एक ही "नाम" के साथ टैग और विशेषता हो सकती है, जो उपसर्ग के माध्यम से योग्य हैं। उदाहरण के लिए आप इस तरह एक XML दस्तावेज हो सकता है:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:human="http://sample.xml.com/Human"> 
    <title>John Smith measures.</title> 
    <body> 
    <human:name>John</human:name> <human:surname>Smith</human:surname> 
    is <human:height unit="feet">6</human:height> feet tall. 
    </body> 
</html> 

इस तरह की सामग्री में "मानव" उपसर्ग http://sample.xml.com/Human नाम स्थान और रिक्त स्ट्रिंग से तत्वों (जो डिफ़ॉल्ट उपसर्ग है) चिह्नित करने के लिए प्रयोग किया जाता है प्रयोग किया जाता है http://www.w3.org/1999/xhtml नामस्थान से तत्वों को चिह्नित करने के लिए। ये यूआरआई नामस्थान पहचानकर्ता हैं, स्कीमा स्थानों नहीं (जिन्हेंया XML Schema instance के साथ व्यक्त किया जा सकता है)। नेमस्पेस यूआरआई द्वारा पहचाने गए स्थान पर नामस्थान का उचित दस्तावेज़ीकरण प्रदान करना एक अच्छा अभ्यास है, लेकिन इसकी आवश्यकता नहीं है (वास्तव में xhtml नेमस्पेस यूआरआई संबंधित डब्ल्यू 3 सी दस्तावेज को इंगित करता है, लेकिन आरएसएस एक्सटेंशन जिसे आप ढूंढ रहे हैं, नहीं) ।

नोट तथापि resolveExternals और validateOnParse दोनों DTDs या स्कीमा परिभाषा के लक्ष्य एक्सएमएल द्वारा संदर्भित की डाउनलोड, लेकिन नहीं नाम स्थान प्रलेखन को प्रभावित कर सकते हैं। किसी भी तरह से, कोई भी पार्सर ऐसे दस्तावेज डाउनलोड नहीं करेगा, क्योंकि यह मानव उपभोग के लिए है।

$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)'); 

इस कारण हो सकता है कारण है कि मैं एक खाली स्ट्रिंग मिलता है, एक आरएसएस फ़ीड से तत्व का मान प्राप्त करते समय?

सं
पहले, जांच करें कि स्रोत एक्सएमएल सही xmlns घोषणाओं में शामिल है और यह तीसरे परमाणु प्रविष्टि (ध्यान दें, तीसरे के अंदर एक <slash:comments> नोड शामिल है कि क्योंकि xpath अनुक्रमण एक है पर आधारित है, ताकि //atom:entry[1] का मतलब प्रत्येक प्रविष्टि जो अपने माता-पिता नोड में पहला है, //atom:entry[2] दूसरा और इसी तरह)।
यदि ऐसा है, तो मुझे संदेह है कि आप परमाणु नामस्थान पंजीकृत करना भूल गए हैं। इस तरह
कोशिश कुछ (उपयोगकर्ताओं के योगदान से DOMXPath::registerNamespace प्रलेखन के लिए अनुकूलित):

$doc = new DOMDocument; 
$doc->loadXML($xml); // your xml string here 
$xpath = new DOMXPath($doc); 

$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom"); 
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/'); 

$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)'); 

आप इस http://codepad.org/JX8RpaKu

पर वास्तव में चल रहा है देख सकते हैं, योग्य xpaths उपयोग करने के लिए, आप डिफ़ॉल्ट नाम स्थान रजिस्टर करने की आवश्यकता भी।

1

आप namespaced नोड्स की सामग्री प्राप्त करने के लिए करना चाहते हैं, तो आप getElementsByTagNameNS की कोशिश की है?

$dom - new DOMDocument($url); 
$slashEls = $dom->getElementsbyTagNameNS('slash', 'slash'); // Assuming the element is <slash:slash> in the XML 
foreach($slashEls as $slash) { 
    // ... 
} 
+0

यह एक खाली DOMNodeList देता है ... –

1

नाम स्थान पर एक ट्यूटोरियल के लिए रों, 13 साल की है लेकिन अभी भी उपयोगी है, मैं क्या समझ वे दस्तावेज़ परिभाषाओं की तरह काम करते हैं, और कुछ XML तत्वों की पहचान करने के लिए आवश्यक हैं से

http://www.jclark.com/xml/xmlns.htm

2

आपके पास कई प्रश्न हैं। मैं क्या समझ वे दस्तावेज़ परिभाषाओं की तरह काम करते हैं, और कुछ 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 देता है ताकि आप समझ सकें कि यह सब क्या है। वास्तव में वह यूआरएल एक यूआरआई है। यह अंतर है और पहचानकर्ता और लोकेटर

The URI Pill: Can be URL or URN

काम कर एक्सएमएल नामस्थान, कुछ भी स्थित होने की जरूरत है करने के लिए। नामस्थान केवल पहचानने की जरूरत है। इसलिए किसी भी यूआरआई के साथ एक वैध एक्सएमएल नेमस्पेस का प्रतिनिधित्व किया जा सकता है। उदाहरण के लिए, 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 वस्तु बनाते हैं, तो आप जब तक कि आप जानते हैं जो उपसर्गों दस्तावेज़ में उपयोग किया जाता है नाम स्थान-यूआरआई रजिस्टर करने की आवश्यकता नहीं है। यही कारण है कि उदाहरण में मैं कोई नेमस्पेस-यूआरआई पंजीकृत नहीं करता हूं।

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