2010-03-18 5 views
5

के सभी घोषित नामस्थान मैं DOM extension उपयोग कर रहा हूँ एक xml xml namespaces युक्त फ़ाइल को पार्स करने को पुनः प्राप्त। मैंने सोचा होगा कि नेमस्पेस घोषणाओं को किसी अन्य विशेषता की तरह ही माना जाता है, लेकिन मेरे परीक्षण असहमत लगते हैं। मैं एक दस्तावेज है कि इस तरह से शुरू होता है है:PHP: एक DOMElement

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:prism="http://purl.org/rss/1.0/modules/prism/" 
    xmlns:admin="http://webns.net/mvcb/" 
    > 

और इस तरह एक परीक्षण कोड:

$doc = new DOMDocument(); 
$doc->loadXml(file_get_contents('/home/soulmerge/tmp/rss1.0/recent.xml')); 
$root = $doc->documentElement; 
var_dump($root->tagName); 
# prints 'string(7) "rdf:RDF"' 
var_dump($root->attributes->item(0)); 
# prints 'NULL' 
var_dump($root->getAttributeNode('xmlns')); 
# prints 'object(DOMNameSpaceNode)#3 (0) {}' 

तो प्रश्न हैं:

  1. किसी को भी पता है जहाँ मैं प्रलेखन मिल सकता है DOMNameSpaceNode का? search on php.net कोई उपयोगी परिणाम नहीं देता है।
  2. मुझे लगता है कि DOMElement से उन सभी के नाम स्थान घोषणाओं कैसे निकाल सकते हैं?

उत्तर

9

जब तक वहाँ एक और अधिक प्रत्यक्ष जिस तरह से आप XPath और उसके namespace axis का उपयोग कर सकते है।
उदा।

<?php 
$doc = new DOMDocument; 
$doc->loadxml('<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:prism="http://purl.org/rss/1.0/modules/prism/" 
    xmlns:admin="http://webns.net/mvcb/" 
    > 
... 
</rdf:RDF>'); 
$context = $doc->documentElement; 

$xpath = new DOMXPath($doc); 
foreach($xpath->query('namespace::*', $context) as $node) { 
    echo $node->nodeValue, "\n"; 
} 

प्रिंट

http://www.w3.org/XML/1998/namespace 
http://webns.net/mvcb/ 
http://purl.org/rss/1.0/modules/prism/ 
http://purl.org/rss/1.0/modules/syndication/ 
http://purl.org/dc/elements/1.1/ 
http://purl.org/rss/1.0/modules/taxonomy/ 
http://purl.org/rss/1.0/ 
http://www.w3.org/1999/02/22-rdf-syntax-ns# 

संपादित करें और btw: DOMNameSpaceNode के लिए मैं नहीं मिला है प्रलेखन या तो। लेकिन आप "घटा" कर सकते हैं (के कुछ हिस्सों) ext/डोम/php_dom.c में स्रोत कोड से अपनी कार्यक्षमता
यह किसी भी तरीकों का पर्दाफाश करने के प्रतीत नहीं होता है और उजागर करता है गुण

"nodeName", "nodeValue", "nodeType", 
"prefix", "localName", "namespaceURI", 
"ownerDocument", "parentNode" 

सभी ने संभाला संबंधित DOMNode गुणों के समान कार्य।

+0

बहुत धन्यवाद, यह निश्चित रूप से एक काम कर समाधान है। मान लीजिए कि मुझे तब तक इंतजार करना पड़ेगा जब तक कि कार्यान्वयन को सही तरीके से प्राप्त करने के लिए PHP दस्तावेज़ अपडेट नहीं किया जाता है। – soulmerge

2

ध्यान दें, कि

echo $root->getAttributeNode('xmlns')->nodeValue . "\n"; 
echo $root->getAttribute('xmlns') . "\n"; 
echo $root->getAttribute('xmlns:syn') . "\n"; 

सब काम अपेक्षा के अनुरूप है, और

http://purl.org/rss/1.0/ 
http://purl.org/rss/1.0/ 
http://purl.org/rss/1.0/modules/syndication/ 

प्रिंट आउट क्योंकि DOMNameSpaceNode एक नोड है, न कि NodeCollection है।

बस स्पष्ट, कि, जब तक पीएचपी डोम विस्तार कोई परिवर्तन होने पर, XPath (के रूप में VolkerK द्वारा समझाया गया है) केवल देशी तरीका, सभी नामस्थान पाने के लिए दस्तावेज की परवाह किए बिना।