• 締切済み

linq で 楽天ウェブサービスのXMLの処理で

vb2008を使って、楽天ウェブサービスから取得したXMLデータを処理しようとしています。 楽天ウェブサービス 楽天ジャンル検索API http://webservice.rakuten.co.jp/api/genresearch/ しかし、<genreSearch:GenreSearch>の処理がうまくいかずに困っています。 Dim elementRakuten = XElement.Load(strRakutenGenreSearchUrl) でデータを受けた後、次のように取り出そうとしました。 elementRakuten.Element("Body").Element("genreSearch:GenreSearch") しかし「':' 文字、16 進数値 0x3A を名前に含むことはできません。」というエラーが出てしまいます。 欲しい情報は<child>の一覧です。 データはこのような感じです。 どのように処理すべきなのかご教授お願いします。 <Response> <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> <Args> <Arg key="developerId" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx">true</Arg> <Arg key="apiVersion" value="20">true</Arg> <Arg key="operation" value="GenreSearch">true</Arg> <Arg key="version" value="2007-04-11">true</Arg> <Arg key="genreId" value="0">true</Arg> </Args> <Status>Success</Status> <StatusMsg></StatusMsg> </header:Header> <Body> <genreSearch:GenreSearch xmlns:genreSearch="http://api.rakuten.co.jp/rws/rest/GenreSearch/2007-04-11"> <child> <genreId>101240</genreId> <genreName>CD・DVD・楽器</genreName> <genreLevel>1</genreLevel> </child> <child> <genreId>100804</genreId> <genreName>インテリア・寝具・収納</genreName> <genreLevel>1</genreLevel> </child> <child> <genreId>551177</genreId> <genreName>メンズファッション・靴</genreName> <genreLevel>1</genreLevel> </child> </genreSearch:GenreSearch> </Body> </Response>"

  • muuuuu
  • お礼率75% (101/133)

みんなの回答

回答No.1

'XNamespaceクラスとAdditions演算子(+)を使おう。第二引数にStringを取る。XNameじゃないんだね。 '文字列を指定しただけで出来るのはXNameへの暗黙の型変換が行なわれているんだと思うけど個人的には嫌い。 'Imports使ってないのは好みの問題です。読みにくくなるけど。 Option Explicit On Option Infer Off Option Strict On Option Compare Binary Class Q5109794 Shared Sub Main() '長いので変数に分けているだけで,特に意味はない。 Dim doc As System.Xml.Linq.XDocument = System.Xml.Linq.XDocument.Load("D:\testfile.xml") Dim body As System.Xml.Linq.XElement = doc.Element(System.Xml.Linq.XName.Get("Response")).Element(System.Xml.Linq.XName.Get("Body")) Dim gSearch As System.Xml.Linq.XElement = body.Element(System.Xml.Linq.XNamespace.Get("http://api.rakuten.co.jp/rws/rest/GenreSearch/2007-04-11") + "GenreSearch") For Each x As System.Xml.Linq.XElement in gSearch.Elements(System.Xml.Linq.XName.Get("child")) System.Diagnostics.Debug.Print(x.Value) Next End Sub End Class

muuuuu
質問者

お礼

名前空間というものと関連しているのですね。 http://www.atmarkit.co.jp/fxml/rensai/rexml06/rexml06.html こちらのサイトを呼んでなんとなく判ってきました。 まだまだ理解できなくてあちこち文献を見ています。 コードありがとうございます。 参考にさせて頂きます。

関連するQ&A

  • XMLのスコープの範囲を教えてください。

    1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </header:Header> 9:</Response> 以上のようなXMLがあると、2行目のxmlns:header="http://ABCのスコープは、8行目まで全て続くと考えてよろしいのでしょうか? 私は、 1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <header:Args> ←変更 4:   <header:Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</header:Arg>  ←変更 5:  </header:Args> ←変更 6:  <header:Status>Success</header:Status>  ←変更 7:  <header:StatusMsg />  ←変更 8: </header:Header> 9:</Response> もしくは 1:<Response> 2: <Header xmlns="http://ABC"> ←変更 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </Header> ←変更 9:</Response> って書くのが普通ではないのかなと考えています。 どうかご教授お願いします。

    • ベストアンサー
    • XML
  • phpのsimplexml_load_fileについて

    あるXMLのデータをsimplexml_load_fileで実行すると SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) という内容が返ってきます。 しかし、その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.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ) Sleipnir/2.5.12">true</Arg> <Arg key="apiVersion" value="111">true</Arg> <Arg key="operation" value="ItemSearch">true</Arg> <Arg key="version" value="2007-10-25">true</Arg> </Args> <Status>Success</Status> <StatusMsg /> </header:Header> - <Body> - <itemSearch:ItemSearch xmlns:itemSearch="http://api.rakuten.co.jp/rws/rest/ItemSearch/2007-10-25"> <count>19244</count> <page>1</page> <first>1</first> <last>30</last> <hits>30</hits> <carrier>0</carrier> <pageCount>100</pageCount> - <Items> - <Item> <itemName>内容1</itemName> <itemCode>crucian:10001064</itemCode> <itemPrice>1</itemPrice> <itemCaption>内容2</itemCaption> <itemUrl>URL1</itemUrl> <affiliateUrl /> <imageFlag>1</imageFlag> <smallImageUrl>画像1</smallImageUrl> <genreId>403911</genreId> </Item> ------------------------------ こんな感じのデータです。 ブラウザでこのXMLを表示させても、この様に表示されます。 SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) この結果が意味しているものは、[Body]以下のものは何も返ってきていないという事なのでしょうか? ここから、普通に内容1・内容2・URL1・画像1(上記のXMLデータの内容)を取り出すには、どうすればよいのでしょうか? 教えて頂けると非常に助かります。

    • 締切済み
    • PHP
  • simplexml_load_file でデータがうまく取得できない

    楽天ウェブサービスの楽天トラベルキーワード検索APIを、 PHP5でsimplexml_load_fileにより利用しているのですが、うまくゆきません。 ■楽天トラベルキーワード検索API http://webservice.rakuten.co.jp/api/keywordhotelsearch/ 1.現象 simplexml_load_fileで取得したデータをprint_rで表示させると、下記のように、ヘッダ(共通パラメーター)の部分が取得できません。 しかしながら、ブラウザからリクエストURLを直打ちすると、正常にデータが取得できていることがわかります。 ■print_rでの出力結果 -------------------------------------------------- SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) -------------------------------------------------- ■コーディング $xml = simplexml_load_file($restURL) or die("XMLパースエラー"); echo "<pre>"; print_r($xml); echo "</pre>"; ■ブラウザにリクエストURLを直打ちして出力した結果 -------------------------------------------------- <Response>  <header:Header>   <Args>    <Arg key="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6">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> <hotelSimple> …… -------------------------------------------------- なぜ、simplexml_load_fileで取得した場合がうまくいかないのか原因がわかりません。 ブラウザ直打ちの場合も、simplexml_load_fileの場合もリクエストURLは同一であることを確認しています。 ちなみに、楽天商品検索APIと楽天トラベル地区コードAPIは既に利用していますが、正常にデータが取得できています。 楽天商品検索APIと楽天トラベル地区コードAPIと、楽天トラベルキーワード検索APIとでの 出力結果の差異は、正常にデータ取得できているAPIの共通パラメーターと呼ばれる部分の名前が、 "<Header>"となっていることです。 楽天トラベル地区コードAPIの場合は、 " <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> " です。 これが原因なのかなとも思いましたが、対処法がわかりません。 どなたかアドバイスをお願いいたします。

    • 締切済み
    • PHP
  • 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
  • PHP5でAPIの結果をXMLパースし参照する方法を教えて下さい。

    下記の様に、APIから情報をXMLパースすることは成功しましたが どうやって使用したらいいか分かりません。 例えば、Itemの0番のパソコンから簡単デジカメプリント注文【1枚15円】Lサイズ・DSCサイズを参照するには $xml->Body->ItemSearch->Items->Item[$i]->itemName だと思うのですが参照出来ません。 ご存じの方が」いらっしゃいましたら教えて下さい。 ------------------------------- SimpleXMLElement Object ( [Header] => SimpleXMLElement Object ( [Args] => SimpleXMLElement Object ( [Arg] => Array ( [0] => true ) ) [Status] => Success [StatusMsg] => SimpleXMLElement Object ( ) ) [Body] => SimpleXMLElement Object ( [ItemSearch] => SimpleXMLElement Object ( [count] => 23003 [page] => 1 [first] => 1 [last] => 30 [hits] => 30 [carrier] => 0 [pageCount] => 100 [Items] => SimpleXMLElement Object ( [Item] => Array ( [0] => SimpleXMLElement Object ( [itemName] => パソコンから簡単デジカメプリント注文【1枚15円】Lサイズ・DSCサイズ [itemCode] => gifucamera:843827 [itemPrice] => 15 [itemCaption] => DPEggと楽天からの二重請求が発生しないよう当店にて処理致します。 [itemUrl] => http:// [shopName] => カメラと写真の専門店ギフカメラ [shopCode] => gifucamera [shopUrl] => http://www.rakuten.co.jp/gifucamera/ [genreId] => 101750 ) [1] => SimpleXMLElement Object....続く (

    • 締切済み
    • PHP
  • $xml要素を階層指定して取得しようとすると、NULLになるのですが…

    $xml要素を階層指定して取得しようとすると、NULLになるのですが…。 ▽元のXMLファイル(楽天トラベルAPI) <Response> _<Body> __<KeywordHotelSearch:KeywordHotelSearch> ___<hotel> ____<hotelBasicInfo> _____<hotelNo>7531</hotelNo> _____<hotelName>パークハイアットホテル</hotelName> ▽$xml = simplexml_load_string($xml);した際の、var_dump($xml) object(SimpleXMLElement)#1 (2) { ["headerHeader"]=> object(SimpleXMLElement)#2 (3) { ["Args"]=> object(SimpleXMLElement)#4 (1) { ["Arg"]=> array(7) { [0]=> string(4) "true" [1]=> string(4) "true" [2]=> string(4) "true" [3]=> string(4) "true" [4]=> string(4) "true" [5]=> string(4) "true" [6]=> string(4) "true" } } ["Status"]=> string(7) "Success" ["StatusMsg"]=> object(SimpleXMLElement)#5 (0) { } } ["Body"]=> object(SimpleXMLElement)#3 (0) { } } object(SimpleXMLElement)#8 (0) { } この後、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch->hotel->hotelBasicInfo; とやると、$itemsが NULL になるのですが、何故でしょうか? (※KeywordHotelSearch:の:は、simplexml_load_stringする前に、str_replaceで処理済です) ちなみに、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch;では、$itemsは下記になります。 object(SimpleXMLElement)#4 (0) { }

    • ベストアンサー
    • PHP
  • 楽天市場ジャンル検索APIで順番が狂う

    楽天市場ジャンル検索APIを使って、 任意の自ジャンル(current)から、子ジャンル(children->child)一覧を 取得し表示しようと思っているのですが、 なぜかAPIから取得した子ジャンルたちが、 おかしな並び順で取得されてしまいます。 例えば 「CD・DVD・楽器」のジャンル「genreId=101240」でリクエストを投げると、 CD : 101311 その他 : 112960 ビデオ : 101327 Blu-ray : 505034 DVD : 101354 レコード : 200531 カセット : 205900 LD : 200532 楽器 : 112493 といった並び順でAPIから返ってきます。 なんで「その他」が上から2番目なんだ・・・orz といった感じで。 理想としては、 DVD : 101354 Blu-ray : 505034 CD : 101311 楽器 : 112493 レコード : 200531 カセット : 205900 ビデオ : 101327 LD : 200532 その他 : 112960 と並び替えたいのですが、 五十音順でもないし、ジャンルIDの昇順降順でもないし、 以前の楽天市場ジャンル検索APIでは、 ちゃんと並んでたのに・・・orz どうやったら並び替え出来るのでしょうか? どうかご教授のほどお願いします。

    • ベストアンサー
    • PHP
  • multiRequest関数で楽天API使用方法

    multiRequest関数にて楽天含め2つのAPIを使用したいのですが、同時にmultiRequest関数で叩くと file_get_contents関数(楽天のコロンを取り除く為)でエラー表示が起きてしまいます。 以下、エラー表示部分 Warning: file_get_contents(<?xml version="1.0" encoding="UTF-8"?><Response><header:Header xmlns:header="http://...・・・・・・<reviewAverage>4.81</reviewAverage><pointRate>1</pointRate><pointRateStar in C:\xxxxx\xxxxx\search.php on line 306 以下、記述内容 $data = array( "http://api.rakuten.co.jp/rws/3.0/rest?developerId=xxxxx&operation=ItemSearch&version=2010-09-15&keyword=$word", "http://productsearch.linksynergy.com/productsearch?token=xxxxxx&keyword=$link_keyword", ); var_dump($data); $r = multiRequest($data); $data = file_get_contents($r[0]); $data= str_replace('itemSearch:ItemSearch', 'itemsearch', $data); $xml = simplexml_load_string($r); print_r($xml); ?>               ここまで。 尚、$xml = simplexml_load_string($r); の上2行を削除し、$xml = simplexml_load_string($r[1]); とした場合はもう1つのAPIの取得は出来ました。 また今、$dataと$rの変数が誤ってる事は存じております。 恐らく、file_get_contents関数の記述がおかしいのかとは思いますが、何がおかしいのか分かりません。 もしかしたら単純な事なのかもしれませんが、調べても全く出てこない為、分かる方がおりましたら、何卒お力添え頂けると助かります。

    • 締切済み
    • PHP
  • ぐるなびAPIからXMLを受け取るまで

    ぐるなびのAPIを使って見ようとHTML,php,javaを勉強しだしたのですが、いきなり詰まってしまいましたので教えてください。 テキストボックスに住所を打って、送信ボタンでぐるなびAPIにURLを送り単純にXMLを受け取るページを作って見たのですがうまく動きません。 HTMLとjavaをくみあわせてみたのですが、関数(?)の使い方が間違っているのでしょうか? <HTML> <HEAD> <TITLE>ぐるなび検索</TITLE> <script type="text/javascript"> function getGurunaviUrl() { var gurunaviApi = "http://api.gnavi.co.jp/ver1/RestSearchAPI/"; var gurunaviKey = "取得したAPIキー"; var queri = gurunaviApi + "?keyid=" + gurunaviKey + "&coordinates_mode=2" + "address=" + juusyo + "&range=3" + "&hit_per_page=30"; return queri; } </script> </HEAD> <BODY> <FORM action="ローカル/index.html(このhtml)" method="get"> <INPUT type="text" size="20" name="juusyo"><INPUT type="button" value="ぐるなび検索" onclick="getGurunaviUrl();"> </FORM> </BODY> </HTML> また、ぐるなびAPIの使い方を紹介しているページなどありましたら教えてください。 宜しくお願いします。

  • PHP初心者です。

    PHP初心者です。 楽天APIを利用し、PHPでパラメータを作成、以下のスクリプトでxslファイルを呼び出しHTMLに成形しました。 (developerIdとaffiliateIdは架空のものです) ---------------------------------------------------------------------------------- <?php $developerId = '1234567891234567891234567891234'; $affiliateId = '12345678912345678912345678912345'; function urlencode_rfc3986($str) { return str_replace('%7E', '~', rawurlencode($str)); } $baseurl = 'http://api.rakuten.co.jp/rws/2.0/rest'; $params = array(); $params['developerId'] =$developerId; $params['affiliateId'] = $affiliateId; $params['version'] = '2009-04-15'; $params['operation'] = 'ItemSearch'; $params['hits'] = '30'; $params['Keywords'] = '××'; $params['page'] = '1'; $params['minPrice'] = '1000'; $params['maxPrice'] = '5000'; $params['availability'] = '1'; $params['imageFlag'] = '0'; $params['genreId'] = '100026'; foreach ($params as $key => $value) { $api .= '&'.$key.'='.$value; } $url = $baseurl.'?'.$api; ?> <?php $xml = new DomDocument(); $xml->load($url); $xsl = new DomDocument(); $xsl->load('item.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?> ---------------------------------------------------------------------------------- これをphp includeで別のHTMLファイルに呼び出したところ、成形されたHTMLタグの一番上に、 truetruetruetruetruetruetruetruetruetruetruetrueSuccess158711130300100 という文字列が返されます(最後の数字はアクセスするたびに変わります)。 この文字を表示させないためにはどのような構文にすればいいのでしょうか。 ご示唆をお願いします。

    • 締切済み
    • PHP