複数の質問があります。私はそれらに一つずつ対処しようとします:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
私が理解していることから、それらはドキュメント定義のように機能し、特定のXML要素を識別する必要があります。
はい、名前空間を持つXMLドキュメントがある場合は常に、各要素を独自の名前空間に含めることができます。
独自の名前空間内の要素にアクセスする場合は、はい、それらを識別するための名前空間が必要です。たとえば、Xpath式内。
PHPでは、XML名前空間はDOMDocumentおよびその他のlibxmlベースの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
PHP DOMDocumentでノードセットの文字列を取得するということは、次のことを意味します。
ノードセットは、ドキュメント順に最初にあるノードセット内のノードの文字列値を返すことによって文字列に変換されます。ノードセットが空の場合、空の文字列が返されます。
ノードは要素であるため、要素ノードの文字列値は次のことを意味します。
要素ノードの文字列値は、要素ノードのすべてのテキストノードの子孫の文字列値をドキュメント順に連結したものです。
したがって、ここで空の文字列を取得する理由は2つあります。ノードセットが空であるか、要素のstring-valueが単なる空の文字列であるかのいずれかです。
count()
次の関数を使用して、ノードセット内のノードの数をすばやく知ることができます。
$result = $xpath->evaluate('count(//atom:entry[3]/slash:comments)');
そうすれば、2つのケースのどちらが当てはまるかがわかります。ソースXMLを共有していないので、なぜ具体的には言えませんが、私が推測するように、ノードが含まれていません。ソースを見ると、これを簡単に明らかにする必要があります。
<atom:entry>
それまでは、おそらく要素を含まず、要素のみを含むRSS2フィードを解析していると推測できます<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
3番目の項目のコメント数として値「1」を出力します。これは、標準のWordpressブログのフィードです。これをインタラクティブな例としてオンラインで公開したので、実際の動作を確認してフィードのURLを入力できます。
ところで: XMLをロードした後DOMXPath
にオブジェクトを作成する場合、ドキュメントで使用されているプレフィックスがわかっている限り、名前空間URIを登録する必要はありません。これが、この例では名前空間URIを登録しない理由です。