2009-06-18 15 views
1

私はxpathを初めて使い、PHPの古くからのXPath実装で問題を抱えています。それは正しいですか?//@urlはちょうど//attribute::urlの省略形ですか?私はテストのためのFlickrのRSSを照会しようとしているが、冗長1が0の要素を返すのに対し、省略クエリは、正しいノードを検索します。PHPのxpathで属性値を選択する

$xml = file_get_contents('http://api.flickr.com/services/feeds/geo/?format=rss_200'); 
$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$xpath = new DOMXPath($doc); 
$xpath->query('//media:content/@url')->length > 0; 
$xpath->query('//media:content/attribute::url')->length == 0; 

私はw3c specsを誤解したのか、これはPHPのバグですか?

関連質問:

期待通りに成功したクエリがDOMAttrオブジェクトを返します。しかし、これらのノードのテキスト値を直接取得する方法はありませんか?何か//media:content/attribute::url/child::text()のようなもの? XPathクエリがユーザーによって入力されるツールでは、DOMTextオブジェクト(DOM *オブジェクトの多数をコーディングするのではなく)が期待できる場合、エラー検出がはるかに優れているツールが必要です。

答えて

4

あなたはおそらくそこにバグがあったようです。それは私に100%うまく見えます。

関連する質問については、クエリの代わりにevaluateを使用して、入力結果を返すようにPHPを取得してください。

あなたはnamespaceを追加しようとしたことがあり:それが失敗した場合、それは通常のノードリスト

編集を返しますか?メディア:一部がループのためにそれを投げている可能性があります。例:

$xpath->registerNamespace('media', "http://search.yahoo.com/mrss/"); 

編集2: ただの参考のために、私はまた、次の

function nsResolve() { 
    return "http://search.yahoo.com/mrss/" 
} 

document.evaluate("//media:content/attribute::url",document,nsResolve,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 

を使ってJavaScriptでこれを試してみましたが、それは(現在は7結果)@urlを使用するのと同じ働き

+0

Thxですが、evaluate()を使用しても役に立ちませんでした。私は名前空間も追加しようとしました。成功しませんでした。私は確かに分かっていませんが、とにかくPHPによって名前空間が文書から抽出されると思います。その場合は – soulmerge

+0

、省略形にしてください。私は、多くの場合(例えばdescendant-or-selfのような)冗長なフォーマットを好む傾向がありますが、冗長属性:: axisを使用しようとしたとは言えません。 –

+0

実際にテストしてくれてありがとう:) – soulmerge

0

//*@url作品ですか?

関連する問題