• 締切済み

名前空間のあるXMLからの取り出し

お世話になります。 <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://aa.com"> </header:Header> <Body> <itemCodeSearch:ItemCodeSearch xmlns:itemCodeSearch="http://bb.com"> <Item> <itemName>@@@@</itemName> </Item> </itemCodeSearch:ItemCodeSearch> </Body> </Response> から、@@@@の部分を抜き出し取得したいのですが、ご存知の方いらっしゃいませんでしょうか? simplexml_load_string()で抜き出すときには、: があるとうまくいかないということですが・・ 全体が$xmlにはいっているとして、 $xml->Body->itemCodeSearch->Item->itemName; とし、うまくいっていたのですが、名前空間がどうのというエラーが発生したりします。 ご存知の方ご教授ください。 宜しくお願いします。

  • PHP
  • 回答数1
  • ありがとう数11

みんなの回答

回答No.1

========xxx.xml(名前空間URIを支障ないものに変更========== <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://www.example.com"> </header:Header> <Body> <itemCodeSearch:ItemCodeSearch xmlns:itemCodeSearch="http://www2.example.com"> <Item> <itemName>@@@@</itemName> </Item> </itemCodeSearch:ItemCodeSearch> </Body> </Response> =============xxx.php050302(俺の環境では5.3.2で実行しているのを示すように設定してある)============ <?php $str = file_get_contents("xxx.xml"); $xml = simplexml_load_string($str); print_r((string)($xml->Body->children("http://www2.example.com",false)->ItemCodeSearch->children("",true)->Item->itemName)); ?> ================ マニュアルの内容が変だったのでバグ報告した。 http://bugs.php.net/bug.php?id=51585

mykhry
質問者

お礼

お忙しい中ご回答頂きまして誠にありがとうございます。 $adr = 'URL'; $tmp = file_get_contents($adr); $xml = simplexml_load_string($tmp); print_r((string)($xml->Body->children("http://api.rakuten.co.jp/rws/rest/ ItemCodeSearch/2007-04-11",false)-> itemcodesearch->children("",true)->item->itemname)); としてみましたが、やはりうまく取得できませんでした。 コロンがはいっているとうまく取得できないみたいです。http://www.csfactory.jp/blog/2008/03/06/%E6%A5%BD%E5%A4%A9-api-%E3%81%A8-simplexml_load_file/ その後のitemName等の要素のアクセスがよくわかりません。 こちらのpearライブラリを利用するとできたのですが、XMLから取得するやり方が気になっています。

関連するQ&A

  • ヘッダーが付いた場合の、simplexml_load_fileでの取り出し方

    simplexml_load_file()を使って <?xml version="1.0" encoding="UTF-8" ?> - <Response> - <header:Header xmlns:header="http://test.com/"> </header:Header> - <Body> - <itemSearch:ItemSearch xmlns:itemSearch="http://test.com/"> <count>2000</count> <page>1</page> ...... この<count>2000</count> の「2000」を取り出すにはどうしたらよういのでしょうか? echo $Xml->Response->Body->itemSearch->count; このXML文書の構成様式が初めてで(ヘッダーが付いている)、いくらやっても 取得できないので宜しくお願い致します。

    • ベストアンサー
    • PHP
  • RSSのXMLロードで失敗してしまう

    RSSのデータを取得する、という処理を行いたいのですが、 文字コードの件でひっかかってしまっているようで なかなか前に進むことができません。 ************ // RSSの内容を取得する $rss_text = file_get_contents(※RSSのフィードURL); // RSSの文字エンコーディングを変換→再変換 $rss_text = mb_convert_encoding($rss_text, 'SJIS', 'UTF-8'); $rss_text = mb_convert_encoding($rss_text, 'UTF-8', 'SJIS'); $rss_text = preg_replace('/[\x00-\x1f]/', '', $rss_text); // RSSをパースする $rss_xml = new SimpleXMLElement($rss_text); if ($rss_xml) { // XML解析に成功した場合 // SimpleXMLElementオブジェクトからデータを取得 $items = $rss_xml->item; foreach($items as $item) { echo 'ID:'. $item->guid. '<br />'; echo 'リンク:'. $item->link. '<br />'; echo '日付:'. $item->pubDate. '<br />'; echo 'タイトル:'. $item->title. '<br />'; echo '本文:'. $item->description. '<br />'; } } ************ こういったコードを組んでいるのですが、現状では Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : attributes construct error in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Couldn't find end of Start Tag rss line 1 in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... このようなエラーが表示されてしまいます。 自分なりに文字コードを処理しているつもりではあるのですが、 他にも何かしなければならないことがあるのでしょうか? どうぞ知恵を貸していただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • 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で名前空間を取り扱う

    楽天ウェブサービスの楽天トラベルキーワード検索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
  • POSTデータが必要なXML取得

    通常のXMLデータはsimplexml_load_fileを使って取得できるようになったのですが POSTデータによって認証の必要なXMLフィールドの取得が解りません。 まずはとっかかりに https://secure.nicovideo.jp/secure/login?site=nicolive_antenna mailとpasswordをPOSTして <?xml version="1.0" encoding="utf-8"?> <nicovideo_user_response status="ok"> <ticket>nicolive_antenna_XXXXXXXXXXXXXXXX</ticket> </nicovideo_user_response> を取得したいのですが、simplexml_load_fileにはコンテキストを付けれないようです。 的外れな内容かもしれませんが、解決の糸口でも教えて頂けると幸いです。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 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
  • 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
  • $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
  • JavaによるXMLの中身の取り出し

    以下のindex.xmlのようなXML文書があるとして、Javaプログラム で<Title></Title>の中身を抜き出したいのですが、うまく取り 出せません。 【index.xml】 <?xml version='1.0' encoding='UTF-8' ?> <?xml-stylesheet type="text/xsl" href="../../../_sys/style.xsl"?> <RDF xmlns:r="○○" xmlns:d="○○" xmlns:s="○○" xmlns="○○"> <ExternalPage about="http://www.pref.iwate.jp/~hp0920/"> <d:Title><s:char code="39">'</s:char>99岩手総体</d:Title> </ExternalPage> </RDF> 【ソース】 public class Example { public static void main(String[] args) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("index.xml")); Element root = doc.getDocumentElement(); NodeList ExternalPageLst = root.getElementsByTagName("ExternalPage"); for (int j=0; j < ExternalPageLst.getLength() ; j++) { Element ExternalPageEle = (Element)ExternalPageLst.item(j); NodeList TitleLst = ExternalPageEle.getElementsByTagName("d:Title"); for (int k=0; k < TitleLst.getLength() ; k++) { Element TitleEle = (Element)TitleLst.item(k); NodeList CharLst = ExternalPageEle.getElementsByTagName("s:char"); Element CharEle = (Element)CharLst.item(0); String Char = CharEle.getFirstChild().getNodeValue(); String Title = TitleEle.getFirstChild().getNodeValue(); System.out.println(Title); } } catch (Exception e) { e.printStackTrace(); } } } 【実行結果】 null 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • 要素の内容にxmlを入れたい

    次のようなxmlを作成しました。 <?xml version="1.0" encoding="UTF-8"?> <tns:StateChange xsi:schemaLocation="http://sample.com/Change.xsd" xmlns:tns="http://sample.com/XSDDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ServiceName>test</ServiceName> <wsdl></wsdl> </tns:StateChange> wsdl要素の内容として <?xml version="1.0" encoding="utf-8\"?><wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema".... といったいわゆるWSDLを文字列として指定したいと考えて、指定するとvalidate時にエラーになってしまいます。 xmlを要素の内容にしたい場合、どのようにすればいいのでしょうか?

    • ベストアンサー
    • XML

専門家に質問してみよう