您有很多問題。我會嘗試一個解決這些問題之一:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
據我瞭解,他們像文件的定義,並要求識別某些XML元素。
是的,只要你有一個帶有命名空間的XML文檔,那麼每個元素都可以在它自己的命名空間中。
如果你想訪問自己命名空間中的元素,那麼是的,你需要命名空間來標識它們。例如。在Xpath表達式中。
在PHP中,XML命名空間受到DOMDocument和其他基於XML的XML擴展的支持。
PHP實際上是否向該URL發出請求並驗證該元素是否存在於文檔定義中?
號,區號,比如你給:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
PHP將不請求URL。你已經注意到URL是空的/給404,所以你可能想知道這是什麼。該URL實際上是一個URI。這是不同的是,標識符和定位器。
對XML命名空間的,沒有什麼需要被定位。命名空間只需要被識別。因此,一個有效的XML名稱空間可以用任何URI來表示。例如,fantasy:space
是一個有效的URI,並且完全限定了要求來指定XML名稱空間。但是當你在瀏覽器中輸入時,你甚至不會得到任何服務器響應(你的瀏覽器不知道「幻想」是什麼)。
所以,你得到的404是不是,爲什麼斜槓是空的,你的XPath計算的原因:
$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)');
你爲什麼在這裏得到一個空字符串的原因是不同的。請參閱Xpath表達式:
string(//atom:entry[3]/slash:comments)
這就是要求節點集的字符串值。已指定的節點設置爲:
//atom:entry[3]/slash:comments
Getting a string of a nodeset在PHP的DOMDocument意味着:
節點集通過返回在節點集是首先在string-value of the node轉換爲字符串文件順序。如果節點集爲空,則返回空字符串。
作爲節點是一個元素,的the element node字符串值是指:
元素節點的字串值是的所有文本節點的後代的字符串值的串聯元素節點按文檔順序排列。
所以在這裏有兩個解釋爲什麼你得到一個空字符串:或者節點集是空的或者元素的字符串值只是一個空字符串。
您可以快速瞭解內部節點的數量的節點集合使用count()
function:
$result = $xpath->evaluate('count(//atom:entry[3]/slash:comments)');
然後應該給你一個更好的主意,這兩種情況是如此。由於您尚未共享源XML,因此不能說爲什麼具體而言,但我認爲它不包含節點。看到來源應該很容易澄清這一點。
在此之前,我只能猜測您可能解析了不包含<atom:entry>
元素但僅包含<item>
元素的RSS 2提要。看我的例子:
$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」作爲第三項的評論計數。這是一個標準的WordPress博客的飼料。 I have put this online as an interactive example, so you can see it in action and enter your feed URL。
BTW:如果您加載了XML之後創建DOMXPath
對象,你不需要,只要你知道哪些前綴文檔中使用註冊的命名空間的URI。這就是爲什麼在這個例子中我沒有註冊任何名稱空間URI。
它返回一個空的DOMNodeList ... –