1

XPath クエリに問題があります。使用して//link[@rel='alternate']いますが、これは null ノードセットを返します。rel=alternateであるすべてのリンクノードの href 属性の値を選択するクエリを作成しようとしています。

私は何を間違っていますか?

以下は、私が使用している xml 構造の単純化されたサンプルです。

<feed>
    <entry>
        <id>1980475</id>
        <link rel="post" href="http://..."></link>
        <link rel="edit" href="http://..."></link>
        <link rel="alternate" href="http://..."></link>
    </entry>
    <entry>
        <id>1980476</id>
        <link rel="post" href="http://..."></link>
        <link rel="edit" href="http://..."></link>
        <link rel="alternate" href="http://..."></link>
    </entry>
</feed>

これも私が使用しているphpコードです:

$xmlDoc = simplexml_load_file("somefile.xml");
$nodelist = $xmlDoc->xpath("//link[@rel='alternate']");
4

1 に答える 1

1

@Jens が指摘したように、おそらく Atom フィードを処理しています。Atom の XML 要素は Atom 名前空間にあり、その URI はhttp://www.w3.org/2005/Atomです。

その名前空間を登録して、XPath 式で使用する必要があります。その方法については、この回答を参照してください。

入力 XML の「簡略化されたサンプル」を投稿したとき、おそらく次のように、デフォルトの名前空間宣言を削除しました。

<feed xmlns="http://www.w3.org/2005/Atom">

この一見取るに足らない変更は<feed>、実際の入力データでは、それらが Atom 名前空間にあるのに対し、そこから派生したすべての要素が名前空間にないことを意味します。これは、サンプル入力でテストしたときにXPath式が機能する理由を説明します(@Passerbyが言ったように)が、実際の入力では機能しません。

a上記のリンク先の回答に示されているように、Atom 名前空間の名前空間プレフィックスとして登録すると、XPath 式は次のようになります。

xpath("//a:link[@rel='alternate']")
于 2013-05-28T18:40:20.963 に答える