RDFの名前空間の要素をxpathで取得する方法

このQ&Aのポイント
  • PHPを使ってhttp://xurrency.com/2.5/usd/to/jpy/feedのdc:valueの値を取得したい
  • 名前空間要素の値をxpathで取得する方法を調べたが、ブラウザでArrayと返ってしまう
  • PHPのバージョン5.2.6でdc:valueの値を取得するにはどのようにコードを書けばいいか
回答を見る
  • ベストアンサー

RDFの名前空間の要素をxpathで取得したい

http://xurrency.com/2.5/usd/to/jpy/feed こちらのURLのdc:valueの値を取得したく、今日初めてPHPを使ってみました。 ネットのいろいろなサンプルを見てみると、xpathで取得できることがわかり、 取得したい値が名前空間という要素だということがわかりました。 コードを書いてみたのですが、ブラウザで読み込むと「Array」という数値が 戻ってきてしまいます。dc:valueの値を取得するにはどのようにコードを 書けばよいでしょうか? (サーバーのPHPのバージョンは5.2.6です。) <?php $xml = simplexml_load_file("http://xurrency.com/2.5/usd/to/jpy/feed"); $xml->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); $result = $xml->xpath("//dc:value"); echo $result; ?>

noname#85028
noname#85028
  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

回答が"SimpleXMLを使うのをあきらめ最初からDOMDocument使え"、になっちゃう。 Arrayから $result[0] という感じでとってきて stringにキャスト (string)$result[0] すればstring-valueらしきものは取得できるが,このことを明示的に記述している仕様の公式文献は見当たらず,信用できない。(周りの誰かが言った、では×。ソースを読むのは,将来のバージョンで変更される虞があるので△。) かと言って、 <?php $xml = simplexml_load_file("http://xurrency.com/2.5/usd/to/jpy/feed"); $xml->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); $result = $xml->xpath("//dc:value"); print_r(getNodeValue($result[0]->asXML()));; function getNodeValue($s){ print($s); $d = new DOMDocument(); $d->loadXML($s); $d->documentElement; return $d->textContent; } ?> とやると $sが <dc:value frequency="daily" decimal="4">248.2477</dc:value> となり, 名前空間接頭辞が消えるため,warningが出て、これもやはり信用できない。 <?php $d = new DOMDocument(); $d->load("http://xurrency.com/2.5/usd/to/jpy/feed"); $p = new DOMXPath($d); $p->registerNamespace("dc","http://purl.org/dc/elements/1.1/"); //個人的に関数名はevaluateの方がしっくり来るが, //関数の仕様的にこっちの方が安全だ。 //個人的にはdescendantって好きじゃない。変えないけど。 $nl = $p->query("//dc:value",$d); 。 print($nl->item(0)->textContent); ?>

noname#85028
質問者

お礼

追加の回答がないので一番最後のソースで組んでみようと思います。 また質問等ありましたらよろしくお願いします。

noname#85028
質問者

補足

詳しいソースの提示ありがとうございます。非常に参考になります。 一番上の(string)$result[0]にしたものと、一番下のDOMDocumentのサンプル動作確認しました。 SimpleXML/xpath共に分かりやすかったため使用しただけで、将来の変更に対して影響を受けにくいソースがあればそちらを提示していただければ助かります。 この場合は一番下のソースを使ったほうが将来的に良いのでしょうか? まだ質問は締め切らないでおきますので、良さそうな記述がありましたらよろしくお願いします。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

質問の意味がほとんど理解できていないので恐縮ですが・・・ たんに「echo $変数」でArrayが返ってきているのが詰まっている箇所なら print_r($変数)でやると配列の状態が分かると思います。

noname#85028
質問者

補足

回答ありがとうございます。 Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [frequency] => daily [decimal] => 4 ) [0] => 248.2477 ) ) print_rでやってみたところこのような値が戻ってきました。これの248.2477の値を取得したいのですが・・・

関連するQ&A

  • simplexmlでルート要素の値を取得したい

    PHPでsimplexmlを用いていますが、XMLから値を取得する方法で、他のタグなどの情報は取り出せるのですが、ルート要素である以下の文章からtotalResultsの値である20だけを取り出したいですがうまくいきません。 <ResultSet totalResults="20" totalReturned="2"> 以下のようにあるところへ投げた結果のXMLを取得しています。 $file = file_get_contents( $url ); $xml = simplexml_load_string( $file ); お手数ですがよろしくお願いします。

    • ベストアンサー
    • PHP
  • SimpleXML関数で取得したXML要素を逆順にしたい

    SimpleXML関数で取得したXML要素を逆順にしたい お世話になります。 phpのsimplexml関数で取得したXML要素を 逆順にして表示させるにはどうしたらよいでしょうか? 通常、RSSなどを読み込み表示させた場合、新しいものから並ぶと思いますが、 これを逆順で古いほうから並ばせたいです。 rsortやarray_reverseを使ってみましたが、うまくいきませんでした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 名前空間の取得について

    下記のようなRSSがある場合の質問です。 ------------------------------------------------------------ <?xml version="1.0" encoding="utf-8" ?> - <rss version="2.0"> - <channel>  <title>RSS</title>  <link>http://www.xxhogehogexx.com</link>   - <item>     <title>タイトル</title>     <link>http://www.xxhogehogexx.com</link>     <description>説明文</description>     <vc:a xmlns:vc="http://www.xxhogehogexx.com">aaaaaaaaaaaaaaaaaaaa</vc:a>     <vc:b xmlns:vc="http://www.xxhogehogexx.com">bbbbbbbbbbbbbbbbbbbb</vc:b>   </item>   - <item>     <title>タイトル</title>     <link>http://www.xxhogehogexx.com</link>     <description>説明文</description>     <vc:a xmlns:vc="http://www.xxhogehogexx.com">aaaaaaaaaaaaaaaaaaaa</vc:a>     <vc:b xmlns:vc="http://www.xxhogehogexx.com">bbbbbbbbbbbbbbbbbbbb</vc:b>   </item>  </cannel>  </rss> ------------------------------------------------------------ phpのsimplexml_load_fileを使って「title」や「link」は習得できるのですが「vc:a」や「vc:b」 といったnamespaceが使用された箇所を習得することができません。 いろいろ調べて「dc:date」など似たような状況のRSSを習得する方法はわかったのですが上記の ものがどうしても習得できませんでした。 どのようにすれば「simplexml_load_file」を使用して習得できますでしょうか? よろしくお願いいたします。

    • 締切済み
    • PHP
  • php5のxpathで結果を連想配列で得るには?

    こんにちは。xpathの結果を連想配列で取得したいのですが、どうすればよいのかわかりません。 ソースは foreach($xml->xpath("/aaa/bbb_id[@id='1']/*") as $key => $value) { $array['$key'] = $value; } という感じで、指定したidの中に存在する子エレメント全て取得しています。 が、$keyは0,1,2...と数字で返ってきてしまいます。 そうではなくて、例えば <aaa> <bbb_id id=1> <hoge>value</hoge> </bbb_id> </aaa> で、"value"を取得したら$keyにはhogeが入ってほしいのですが、どのように書けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP
  • 為替レートを取得したい。 json

    http://www.secondstrade.com/ からcurl使って 現在のUSD/JPYレートの値を取得したい。   http://www.secondstrade.com/js/compile4.jsに中に ws://54.178.129.194:9997/jWebSocket/jWebSocket/がある。 これにどんな情報をpostすればレートを取得できますか??

  • Yahoo APIのXMLの取得について

    Yahoo APIのXMLで総数(totalResultsAvailable)を取得したいのですが、取得できません。 $url = "http://api.search.yahoo.co.jp/WebSearchService/xx/webSearch?appid=xxxxx&query=$query"; $xml= simplexml_load_file($url); $yahooxml=$xml->Result->Item ; $totalResults = $yahooxml->{totalResultsAvailable}; print_r ($totalResults); $urlは問題なく値が入ってるのですが、$totalResults ではSimpleXMLElement Object ( ) と返ってきてしまいます。どうすれば、$totalResults の値を取得できるのでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • XML::XPathでのfor文の記述

    たびたびお世話になります。よろしくお願いいたします。 perlでXML文書をHTMLへ変換しています。 ---------------------------------------- <!-- file.xml --> <root> <jouhou> <mei> <toushu>あ</toushu> <toushu>い</toushu> <toushu>う</toushu> </mei> <mei> <toushu>え</toushu> <toushu>お</toushu> <toushu>か</toushu> </mei> </jouhou> </root> ---------------------------------------- このようなXMLの場合に、XML::XPathで「あ」と「え」などの最初に来る<toushu>取りたいのですが 日によって<mei>の数が異なるため、<mei>の数を取得してその数でforをすることにしました。 が、うまくいきません。 my $xp = new XML::XPath( filename => "./file.xml" ); for(my $j=1;$j<=$xp->findvalue("count(//jouhou/mei/toushu)");$j++){ print $j; #←ここでは1と2が出ます。 print $xpath->find('//jouhou/mei[$j]/toushu')->get_node(1)->string_value; } このままでは全く出なく、["$j"]とすると、出るには出るのですが「あ」が2回出てしまいます。 書き方が違うと思うのですが、()でくくってみても出ません。 ちなみに print $xpath->find('//jouhou/mei[1]/toushu')->get_node($j)->string_value; だと、ちゃんと「あ」と「い」が出ました…。 もし、お分かりになれば教えていただきたいです。 お手数をおかけしますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • PHP5で名前空間を取り扱う

    楽天ウェブサービスの楽天トラベルキーワード検索APIを、PHP5で利用しようとしています。    ■楽天トラベルキーワード検索API     http://webservice.rakuten.co.jp/api/keywordhotelsearch/ 出力パラメータの一部は名前空間で定義されており、下記の参考Webサイトのコーディング例に従ってソースを実行しましたが、children関数を実行する行で、 "Fatal error: Call to a member function children() on a non-object in " と表示されてしまいました。 どのようにコーディングするのが正しいのか、教えていただけないでしょうか。 ■参考にしたWebサイト 「IBM PHPでのSimpleXML 処理」 http://www-06.ibm.com/jp/developerworks/xml/library/x-simplexml.shtml?ca=drs ■実行ソース $xml = simplexml_load_file($restURL) or die("XMLパースエラー"); $cd = $xml->Response->header->children('http://api.rakuten.co.jp/rws/rest/Header'); ■実行環境  PHP Version 5.1.4  Apache 2.0 Handler ■xmlの構造 <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> <Args> <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)">true</Arg> <Arg key="developerId" value="****">true</Arg> <Arg key="affiliateId" value="****">true</Arg> <Arg key="operation" value="KeywordHotelSearch">true</Arg> <Arg key="version" value="2007-04-11">true</Arg> <Arg key="keyword" value="アートホテルズ札幌">true</Arg> </Args> <Status>Success</Status> <StatusMsg /> </header:Header> <Body> <keywordHotelSearch:KeywordHotelSearch xmlns:keywordHotelSearch="http://api.rakuten.co.jp/rws/rest/KeywordHotelSearch/2007-04-11"> <hotelSimple> <hotelNo>5903</hotelNo> <hotelName>アートホテルズ札幌</hotelName> <areaSum /> <hotelSpecialSum /> <middleClassCode>hokkaido</middleClassCode> <smallClassCode>sapporo</smallClassCode> <hotelInformationUrl>http://img.travel.rakuten.co.jp/image/tr/api/kw/JBe8h/?f_no=5903</hotelInformationUrl> <hotelAffiliateUrl>http://***/hgc/04230ff1.13a55c09.04230ff2.eed97e0f/?pc=http%3A%2F%2Fimg.travel.rakuten.co.jp%2Fimage%2Ftr%2Fapi%2Fkw%2FJBe8h%2F%3Ff_no%3D5903</hotelAffiliateUrl> </hotelSimple> <recordCount>1</recordCount> </keywordHotelSearch:KeywordHotelSearch> </Body> </Response>

    • ベストアンサー
    • PHP
  • PHPでのXMLの編集・削除の方法

    XMLの編集・削除をPHPで行いたいと思っています。 その際に、どの要素なのかを指定したいと思うのですが なかなか方法が分からずに困っています。 調べてみて、Xpathを利用して指定し 削除をする時には DOMNode = DOMNode->removeChild(ノード) 編集する時には DOMNode->nodeValue = 値 と、いうものを利用すればいいのかな?と分かってきたのですが 実際、PHPに組み込んでみても、動いてくれず分からなくなっています。 【削除PHP】 foreach ($_POST['number'] as $key => $value){ $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//title[parent::record/@number=$value]"); //要素ノードの取得 $dataElement = $doc->getElementsByTagName("title")->item(0); //削除 $dataElement->removeChild($xpath_title) or die("削除できません。"); } 【編集PHP】 $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//record/@number=$session_number"); //値の変更 $session_title = $_SESSION["title"]; $xpath_title->title->nodeValue = $session_title; print $xpath_title->title->nodeValue; 【XML】 <renew>  <record number="000000">   <title>タイトル</title>   <paragraph>内容</paragraph>  </record> </renew> 字数制限の為に、コードも必要最低限だと思われるものしか 記述していません。これでは分からないという事であれば 追記で記述しますので、分かる方は是非教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP