2011-08-04 26 views
10

与えられた名前空間にある属性に基づいてフィルタリングするXPath式を作成する必要があります。 XMLの例:名前空間を持つ属性のXPathフィルタ

<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' 
    xmlns:yt='http://gdata.youtube.com/schemas/2007'> ... 
<entry> 
    <media:group> 
    <media:thumbnail url='http://i.ytimg.com/1.jpg' yt:name='default'/> 
    <media:thumbnail url='http://i.ytimg.com/2.jpg' yt:name='hqdefault'/> 
    <media:thumbnail url='http://i.ytimg.com/3.jpg' yt:name='start'/> 
    <media:thumbnail url='http://i.ytimg.com/4.jpg' yt:name='middle'/> 
    </media:group> 
</entry> 

属性yt:nameが 'hqdefault'に設定されたノードのURLを取得する必要があります。

私は、XPath式

'./media:group/media:thumbnail[@yt:name='hqdefault']/@url' 

と試みたが、YTと名前空間属性を指定するようだ:名前は動作しません。私は、クエリを作成すると空のDOMNodeListを取得します。

私はPHPでXMLにアクセスしていますので、私は登録YT名前空間:

registerNamespace('yt', 'http://gdata.youtube.com/schemas/2007'); 

のthnx事前

+0

「動作しない」:

はここで完全な作業例です。エラーメッセージ? – LarsH

答えて

0

yt名前空間接頭辞は、あなたの例のXMLで使用されますが、宣言されていません。そのサンプルXMLが本当にすべて存在する場合、それは正しい形式のXML(名前空間の用語ではない)です。したがって、XSLTなどの一般的なXMLツールでは、それを処理することはできません。

一方、ソースドキュメントのどこかに、私たちが表示していない、ytという名前空間プレフィックスの宣言がある場合は、XPath処理環境(XSLTは推測します)のプレフィックスを宣言する必要があります同じ名前空間URI。例えば。

<xsl:stylesheet ... xmlns:yt="theNamespaceURIForYT"> 

XPathは、ソースドキュメントで発生する名前空間接頭辞の宣言を認識していません。各要素(および属性)がどのネームスペース(URI)に属しているかだけを知っています。

+0

私はXML全体を入力しなかった、申し訳ありません。 YouTube再生リストのエクスポートXMLです。 ' wurdalack

4

XPathが正しいように見えます。

ライブラリが名前空間の属性をサポートしていないか、yt名前空間および/またはmedia名前空間を正しく登録していない可能性があります。

だけではなく、名前空間接頭辞を使用するよりも、述語フィルタの内部local-name()namespace-uri()にマッチングしてみてください。

./*[local-name()='group' 
     and namespace-uri()='http://search.yahoo.com/mrss/' 
    ]/*[local-name()='thumbnail' 
     and namespace-uri()='http://search.yahoo.com/mrss/' 
     and @*[local-name()='name' 
       and namespace-uri()='http://gdata.youtube.com/schemas/2007' 
       and .='hqdefault' 
       ] 
     ]/@url 

これが動作する場合、それらのネームスペースでのための名前空間を登録する問題があります接頭辞。残りを仮定

1

は順番に、単に//media:group/...を取得するために/とのxpathで最初.を交換(または/atom:feed/media:group/...で始まり、原子名前空間を登録する)です。 - あなたは何が起こるかを言う必要が

<?php 
$dom = new DOMDocument(); 
$dom->loadXML(<<<XML 
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' 
    xmlns:yt='http://gdata.youtube.com/schemas/2007'> 
    <entry> 
    <media:group> 
     <media:thumbnail url='http://i.ytimg.com/1.jpg' yt:name='default'/> 
     <media:thumbnail url='http://i.ytimg.com/2.jpg' yt:name='hqdefault'/> 
     <media:thumbnail url='http://i.ytimg.com/3.jpg' yt:name='start'/> 
     <media:thumbnail url='http://i.ytimg.com/4.jpg' yt:name='middle'/> 
    </media:group> 
    </entry> 
</feed> 
XML 
); 

$x = new DOMXPath($dom); 
$x->registerNamespace('yt', 'http://gdata.youtube.com/schemas/2007'); 
$x->registerNamespace('media', 'http://search.yahoo.com/mrss/'); 
$l= $x->query("//media:group/media:thumbnail[@yt:name='hqdefault']/@url"); 
for ($i=0; $i<$l->length; $i++) var_dump($l->item($i)->value); 
関連する問題