SimpleXMLは、複数のオブジェクトを返す、どのように私は、データを得ることができますか?
-
18-09-2019 - |
質問
私はこのXMLを解析するためのSimpleXMLを使用していますのファイル。それは私がYouTubeのAPIにアクセスするために使用していますフィードです。私は、オブジェクト内の最新のビデオを埋め込むと、次の4サムネイルを表示します。
だから私は、各フィードの値にアクセスするためにsimplexml_load_file
ループを使用して行く、これにforeach
を使用しています。
私は何の問題値にアクセスすることはできませんが、私はそれが別々のSimpleXMLElement Object
内の各ビデオを保存する問題に遭遇します。私は、彼らが配列に格納されていないとして、私がアクセスしていたオブジェクトの上に任意のコントロールを持っていません。だから私は、たとえば、$thumb[4]
または$entry[4]->thumb
を取得することはできません。
私はSimpleXMLIterator
を使用しようとしましたが、何らかの理由で、同じ始まりを持っている任意の値が空白としてレンダリングされます。例えば、ビデオは11のバリエーションを持つことができます:
そして、これらはそれぞれなど[1]=""
、[2]=""
、[3]=""
、としてレンダリングされます。
私は喜んで助けることができる誰にもいくつかのより多くの情報を提供します!
編集
ここに私の結果をしますprint_rです。これはあなたに私が直面してるの構造問題のアイデアを与えるために、単一の変数に対して行われます。全体ますprint_r($エントリー)をXMLファイル内の各ノードの変数を与えるだろう。
SimpleXMLElement Object
(
[0] => 159
)
SimpleXMLElement Object
(
[0] => 44
)
また、ますprint_rは単にテストのためのPHPブロック内にあります。私は実際にHTMLでエコー内の変数にアクセスするために探しています。
解決
あなたは名前空間とのSimpleXML での問題に遭遇しました。フィードは、
で始まります<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
xmlns='http://www.w3.org/2005/Atom'
はhttp://www.w3.org/2005/Atom
にデフォルトの名前空間を設定します。即ちその子要素本当にid
ではありません、updated
、category
しかしhttp://www.w3.org/2005/Atom:id
、http://www.w3.org/2005/Atom:updated
など...
に
あなたは$feed->id
経由id要素にアクセスすることはできませんので、あなたは方法にSimpleXMLElementを必要とします::子供()の。それはあなたが取得したい子要素の名前空間を指定できます。
たとえば、
$feed = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true');
$children = $feed->children('http://www.w3.org/2005/Atom');
echo $children->updated;
現在2010-02-06T05:23:33.858Z
を印刷します。
あなたはecho $children->entry[0]->id;
を使用することができます最初のエントリ要素のidを取得する。
しかし、その後...、<media:group>
名前空間にあるどのようにあなたが<media:category
要素を打つだろうとその子供たちが<media:player>
、xmlns:media='http://search.yahoo.com/mrss/'
及びます。
$feed = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true');
$group = $feed->children('http://www.w3.org/2005/Atom')
->entry[0]
->children('http://search.yahoo.com/mrss/')
->group
->children('http://search.yahoo.com/mrss/')
;
echo $group->player->attributes()->url, "\n";
foreach( $group->thumbnail as $thumb) {
echo 'thumb: ', $thumb->attributes()->url, "\n";
}
(現在)を印刷
http://www.youtube.com/watch?v=ikACkCpJ-js&feature=youtube_gdata
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/2.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/1.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/3.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/0.jpg
編集:私は、おそらく多くのJavaScriptを使用してブラウザ内が、ここでは(簡単な、醜い)の例のアプリだと思いません。
<?php
//define('TESTENV' , true);
function getFeed($author) {
// <-- add caching here if needed -->
if ( !defined('TESTENV') ) {
$url = sprintf('http://gdata.youtube.com/feeds/api/videos?author=%s&max-results=5',
urlencode($author)
);
}
else {
$url = 'feed.xml';
}
return simplexml_load_file($url);
}
$feed = getFeed('jonlajoie');
if ( !isset($_GET['id']) ) {
$selected = '';
}
else {
$selected = $_GET['id'];
printf ('
<object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/%s"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always">
</param>
<embed src="http://www.youtube.com/v/%s" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed>
</object>',
htmlspcialchars($selected), htmlspcialchars($selected)
);
}
$item = 0;
foreach( $feed->children('http://www.w3.org/2005/Atom')->entry as $entry ) {
$entryElements = $entry->children('http://www.w3.org/2005/Atom');
$groupElements = $entry
->children('http://search.yahoo.com/mrss/')
->group
->children('http://search.yahoo.com/mrss/')
;
if ( !preg_match('!^http://gdata.youtube.com/feeds/api/videos/([^/]+)!', $entryElements->id, $m) ) {
// google can choose whatever id they want. But this is only a simple example....
die('unexpected id: '.htmlspecialchars($entryElements->id));
}
$id = $m[1];
if ( $selected!==$id ) {
printf('<a href="?id=%s"><img src="%s" /></a>',
urlencode($id),
$groupElements->thumbnail[0]->attributes()->url
);
}
}
編集2:「私は右、ノード[#]への正確なアクセスが必要になりますように私は、サムネイルをクリックすると、私はメインスペースでビデオをロードするためのjQueryを使用しますが?」
(すべてでは必要に応じて)あなたはすでにのJavaScript / jQueryのあなたのPHPスクリプトを使用している場合は、単純に返すことができ、すべてのビデオおよびあなたのjQueryのスクリプトのすべてのデータの(JSONエンコードされた)の配列は、データをどうするかを見つけ出すことができます。
他のヒント
$doc = new DOMDocument();
$doc->loadXML(file_get_contents('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true'));
$xpd = new DOMXPath($doc);
$xpd->registerNamespace('atom', "http://www.w3.org/2005/Atom");
false&&$node = new DOMElement();//this is for my IDE to have intellysense
$result = $xpd->query('//atom:feed/atom:entry[1]/media:group/media:thumbnail');
foreach($result as $node){
echo $node->getAttribute('url').'<br />';
}
echo "more results <br />";
$result = $xpd->query('//atom:feed/atom:entry[1]/media:group/media:thumbnail[1]');
foreach($result as $node){
echo $node->getAttribute('url').'<br />';
}
その点に$sxml->entry[4]->thumb
か何かをしてみます。
AKA、最初のエントリのIDにアクセスするには、あなたが行くだろう$sxml->entry[4]->id
基本的$sxml->entry
はSimpleXMLElement Object
sの配列です。あなたがそれらをforeachのときは、上向きに、各オブジェクトを経由して$entry
に割り当てるので、その$entry = $sxml->entry[0]
されます。
あなたはこのように行くことができます:
print_r($sxml);
全体の構成を確認します。そして、それはあなたがそれにアクセスするために使用するために必要なものを教えてくれます。
最後に、私は1つが最も最近の 1 のエントリを示すXMLフィードを走る、2 foreach文をしました。その後、私は見よを再生するには、この周りのオブジェクトをエコー。
他では、私は、サムネイルのリストのリスト要素を返し、最新の4つのエントリを駆け抜けます。
さて、私はサムネイル映像をクリックすると、メインエントリにパラメータを渡すJavaScriptのハンドル。さて、パラメータを受信すると、その主な目的をリロードする方法を、私はアイデアを開いている。