• 締切済み

ActiveXObjectで取得したXMLの解析処理ができない

Ajaxの勉強をしているのですが困っています。 ActiveXObjectで取得したXMLの解析処理ができないのです。 1.JavaScriptで新たにActiveXObjectのオブジェクトを作成 (例)var obj = ActiveXObject(Msxml2.XMLHTTP); 2.上記オブジェクトに対しopen(),send()を行う。 (例)obj.open(callback,url,false); 3.サーバーにてリクエスト受信後、JSP上に記述したXMLを送信。 4.上記オブジェクトに対しresponseXMLを行う。 (例)var doc = obj.responseXML; 5.XMLの要素を取得 (例)doc.getElementsByTagName("name"); 4の結果何らかのオブジェクトは取れているようなのです(alertで表示してみると"[Object]"と表示される。)が、実際に5でXML中の要素を取ろうとすると何も取得できません。一方4をobj.responseText;とすると、(alertで表示してみると文字化けしていますがXMLの)内容が取得できます。 なぜレスポンスをXMLにして取得した場合、情報を取得できないのでしょうか?ご教授いただけませんでしょうか? よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>javaScript実行後のitem.lengthは0で、 同じXMLをうちのサーバーにアップして、 同様に試してみましたが、 item.length=2 で問題なく取得できました。 表面上同じように見える doc.getElementsByTagName("item") と <item>の "item"が違うのかなと思います。 文字コード自体は、マルチバイト文字が使われていないので、なぜ違うということになるのかよくわかりません。 ちなみに、 alert(doc.xml); でXMLを表示してみたらXML全体が表示されますか? できたら、コードを補足できますか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

getElementsByTagName が返すのは、ノードリストですが、ちゃんとノードリストとして処理していますか? あと、 XMLの方で <?xml versin="1.0" encoding="UTF-8" ?> のようにXML宣言がちゃんと書かれていますか? <?xml versin="1.0" ?> の場合うまく処理できない場合があるようです。 (宣言自体が省略されている場合は、大丈夫、ただしUTF-8)

cos_theta
質問者

補足

BLUEPIXYさん、ご返答ありがとうございます。 javaScript中では var item = doc.getElementsByTagName("item") JSP上の送信XMLは <?xml version="1.0" encoding="UTF-8" ?> <List> <item> <name>name1</name> <value>value1</value> </item> <item> <name>name2</name> <value>value2</value> </item> </List> と記述しています。 javaScript実行後のitem.lengthは0で、 念のため宣言をはずして試行してみましたが駄目でした。 後はXMl解析のコーディングミスなどが考えられますが、 上記javaScript実行直前ではobj.responseTextでXMLが取得できます。 何か他に問題はあるでしょうか?

関連するQ&A

  • javascriptでXML IEとfireFox

    作成中のホームページで、条件を入力させてその条件に合ったデータ(XMLで管理)を表示する という内容のモノを作ろうとしています。 実際に一通り動く所までは出来たのですが、IEでしか動作せず Firefox等の他ブラウザだと動作しません。 調べてみると、ActiveXObjectが使えないようなのですが どういう方法で実装すると動作するようになるのでしょうか。 よろしくお願いします。 ----------以下ソース一部---------- // ワーク用の XML ドキュメントオブジェクト var objDocWk = new ActiveXObject("Msxml2.DOMDocument.3.0") // 出力用の新しいルートノードを作成 dstNd = objDocWk.createNode(1, "list", "") // XML ドキュメントオブジェクト生成 var objDoc = new ActiveXObject("Msxml2.DOMDocument.3.0") objDoc.async = false objDoc.load("msch.xml") var objRootNode = objDoc.documentElement.childNodes =======================補足======================= 下記のようにやってみたのですが、jsのエラーが起り原因がわからないです。※fireFoxのみIEでは動作確認済 if (window.ActiveXObject) { //for IE // XML ドキュメントオブジェクト生成 var objDoc = new ActiveXObject("Msxml2.DOMDocument.3.0") objDoc.async = false // 曲情報の読込み objDoc.load("msch/msch.xml") // ワーク用の XML ドキュメントオブジェクト var objDocWk = new ActiveXObject("Msxml2.DOMDocument.3.0") } else { //for Firefox // XML ドキュメントオブジェクト生成 var xhttp = new XMLHttpRequest(); xhttp.open("GET", "msch/msch.xml", false); xhttp.send(null); var objDoc = xhttp.responseText; window.alert(objDoc); // ワーク用の XML ドキュメントオブジェクト var xhttp2 = new XMLHttpRequest(); xhttp2.open("GET", "msch/msch.xml", false); xhttp2.send(null); var objDocWk = xhttp2.responseText; window.alert(objDocWk); } // 出力用の新しいルートノードを作成 dstNd = objDocWk.createNode(1, "musiclist", "") // 曲情報のルートノードを取得 var objRootNode = objDoc.documentElement.childNodes エラー内容が objDocWk.createNode is not a function  と objDoc.documentElement is undefined   です。

  • htmlで記述されたWebページの解析と情報取得

    特定のWebページを取得し、その情報の一部を利用したいと思っています。 そのページはXML形式ではなく一般的なhtml形式です。 今はやり方がわからない為、ブラウザに一旦受けさせて ブラウザの機能でパースしてもらってそれを利用しています。 しかし、スマートではないのでこのやり方から卒業したいと思っています。 (そもそもAjaxじゃないし) これを(一旦html文字列を取得して)何かのJavaScriptライブラリ等を利用して 「getElementsByName…」等を利用できる形のオブジェクトに 変換したいと思っています。 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open('GET', …); … htmlStr = xmlhttp.responseText; // ←これを使う? htmlDom = hoge.parse(htmlStr); htmlDom = xmlhttp.responseHTML; // ←こんな感じのがあれば最高 alert(htmlDom.getElementsByName("…")[0].value); google提供のライブラリに「GXml.parse」というものがあり、 XML文字列をXML DOM 形式にパースするという機能があります。 これのhtml版はないものかと思っているしだいです。 例えば、以下のページ(どちらでもいい)から為替レートを取得したい場合などです。 外為 レート - Infoseek マネー http://money.www.infoseek.co.jp/MnForex/fxrate/ 外為 米ドル/円 - Infoseek マネー http://money.www.infoseek.co.jp/MnForex/fxdetail/?fx=F1001 ※今回の質問は「どこでもいいから為替レートを取得する方法」ではありません。  知りたいのはhtmlのパース方法です。為替はあくまでも例です。 (Webブラウザにレンダリングさせないで) html文字列をparseする方法。(JavaScriptライブラリの使用可) ※html文字列からでなくともいい これを教えてください。よろしくお願いします。

    • ベストアンサー
    • AJAX
  • CGIを呼び出した場合の戻り値をDOMオブジェクトにする

    var rtn; var obj = new XMLHttpRequest(); obj.open("GET","/test.xml"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){   if(obj.readyState == 4){     rtn = obj.responseXML);   } } この場合のrtnの値はtext.xmlのDOMオブジェクトとなりますが、 これを、 var obj = new XMLHttpRequest(); obj.open("GET","/test.cgi"); obj.send(""); とし、cgiからの戻り値としてDOMオブジェクトを受けることは可能ですか? やはりcgiからプログラムを通じてxmlファイルを作成し、 それをもう一度、 obj.open("GET","/test.xml"); obj.send(""); として読み込むしかないでしょうか?

  • XML DOMについて

    JavaScriptでDOMを使用して、xmlhttp.sendで指定のPHPファイルに送信しましたが、 PHP側で値を取得できません。 (PHP Ver.5.3.0) 以下、JavaScript var UserID="abc"; var Password="abc"; var xmlDoc = new ActiveXObject("Microsoft.XMLDom"); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml","version=\"1.0\"")); var root = xmlDoc.createElement("xDoc"); xmlDoc.documentElement=root; var node_Item = xmlDoc.createElement("Command"); root.appendChild(node_Item); var node_UserID = xmlDoc.createElement("UserID"); node_UserID.appendChild(xmlDoc.createTextNode(UserID)), node_Item.appendChild(node_UserID); var node_Password = xmlDoc.createElement("Password"); node_Password.appendChild(xmlDoc.createTextNode(MDString(Password))), node_Item.appendChild(node_Password); var node_Sufix = xmlDoc.createElement("Sufix"); node_Sufix.appendChild(xmlDoc.createTextNode(Sufix)), node_Item.appendChild(node_Sufix); var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("post",topURL("main/Log.php"),false); xmlhttp.send(xmlDoc); 以下、Log.php <?php session_start(); $DEBUG_MODE=false; $xmlLogQ=$_SERVER['DOCUMENT_ROOT']."/test/temp/Request.xml"; $xml = new DOMDocument(); $xml->async=false; if (!$DEBUG_MODE) { if ($XML_LOG) { $xml->save($xmlLogQ); } } else { if ($XML_LOG) { $xml->load($xmlLogQ); } } $doc=$xml->documentElement; if ($xml->parseError.errorCode==0) { $xml = $node=$doc->selectSingleNode("Command/UserID"); if (!($node==null)) { $UserID=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Sufix"); if (!($node==null)) { $Sufix=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Password"); if (!($node==null)) { $Password=$node->text; $node=null; } } ?> 保存したXML上、<?xml version="1.0"?>以降書き込みできてません。 どの部分がおかしいか不明の為、申し訳ないですがご教授お願いします。

    • ベストアンサー
    • PHP
  • すいません。調べても分からないので質問します。

    すいません。調べても分からないので質問します。 JAVASCRIPTでXMLの操作をしています。 デバッグのため、XMLの全体を表示したいのですが、どのプロパティを使ったら良いか分からないのです。 クライアント側でDOMを使ってXMLの中身を修正した後に xmlHttp.responseTextをalertで表示するように修正後のXMLの中身を見たいのです。 xmlData = xmlHttp.responseXML; としたときのxmlDataからXMLをテキストで取り出すプロパティがあるのではないかと思うのですが見つけられません。 使用しているのはmac os x 10.6のsafari4.04です。 他のブラウザなら出来るなどの情報でも構わないのでご存じの方がおりましたらお願いします。

  • Ajax テキストエリアについて

    作ったテキストエリアにXmlHttpObjを出力したいのですがどのようにすればいいでしょうか? テキストエリアは <textarea id="text" style="width:100%; height:300px;"disabled></textarea><br> というように作りました。 XmlHttpObjは var xmlhttp; function httpHandler(){ if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ alert(xmlhttp.responseText); } } function onButtonclick(){ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.onreadystatechange = httpHandler; xmlhttp.open("GET", "data.txt"); xmlhttp.send(null); } このようにしました。(仮で出力をアラート形式にしております。) 回答よろしくお願いします。

    • ベストアンサー
    • AJAX
  • javaScriptからxmlファイルを読み込みたい。

    strutsで開発を行ってるのですが、javaScriptからweb.xmlに設定してあるsession-timeoutの時間を取得したいのです。 javaScriptからxmlファイルをparseできるみたいで、ネットを参考に書いてみたのですが。うまく動きません・・・以下がソースです。 jsファイルをweb.xmlと同じ階層において試したのですが 、うまく読み込めていないようなのです。どなたかご教授お願いできないでしょうか? javaScriptからweb.xmlを読み込むことは不可能なのでしょうか? ちなみにブラウザはIE6.0以上限定です。 function readXML(){ xml_doc = new ActiveXObject("Microsoft.XMLDOM"); xml_doc.async = false; if(xml_doc.load("web.xml")){ alert("success!"); }else{ alert("error!"); } }

  • Ajaxでデータベース(PostgreSQL)

    を非同期で読み込むことができるでしょうか? ファイルならば下記のようにすれば良いみたいですが データベースの場合のやり方がわかりません。 PostgreSQLのデータを読み込むにはどうしたら良いのでしょうか? <script> var xmlHttp; function loadText() { if (window.XMLHttpRequest) { xmlHttp=new XMLHttpRequest(); } else { if(window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else { xmlHttp = null; } } xmlHttp.onreadystatechange=checkStatus; xmlHttp.open("GET","plan.txt",true); xmlHttp.send(null); } function checkStatus() { if(xmlHttp.readyState==4 && xmlHttp.status==200) { alert(xmlHttp.responseText); } } </script> <form> <input type="button" value="read file" onClick="loadText()"> </form>

  • Firefoxでxml読み込み

    htmlとjavaScriptでかいてます. IEでやるとうまくいくのですが,Firefoxだとうまくできません. alertは確認のためにいれてしました. xml_doc.loadがうまくできないみたいです. function Get_LocalSearch(){ //フォームに入力された住所をエンコード address = encodeURI(document.form1.address.value); // DOMオブジェクト生成 if (document.all) { //IE xml_doc = new ActiveXObject("Microsoft.XMLDOM"); } else { // firefox xml_doc = document.implementation.createDocument("", "", null); } xml_doc.async = false; alert("1"); (←ここはでる) // ローカルサーチの呼び出し(XMLの読み込み) xml_doc.load("http://api.map.yahoo.co.jp/LocalSearchService/V1/LocalSearch?appid=*** &p=" + address); alert("2");   (←これがでない)         ・         ・        }       <form name="form1"> 住所・郵便番号・施設・駅<br> <input type="text" name="address" size=30> <input type="button" value="検索" onClick="Get_LocalSearch()">     </from></br>

  • VBAでxmlから特定の文字を変数に入れたい

    VBAからXMLを取得したくて方法を検索し、以下のコードで何とか取得ができました。 Sub httpRequest() Dim HttpReq As MSXML2.XMLHTTP Dim DomDoc As MSXML2.DOMDocument Dim targetURL As String targetURI = "http://www.drk7.jp/weather/xml/14.xml" 'HTTP GET Set HttpReq = CreateObject("MSXML2.XMLHTTP") HttpReq.Open "GET", targetURI, False HttpReq.send (Null) 'XML PARSE Set DomDoc = CreateObject("MSXML2.DOMDocument") DomDoc.LoadXML (HttpReq.responseText) dumpDomDoc DomDoc.ChildNodes Set HttpReq = Nothing Set DomDoc = Nothing End Sub Sub dumpDomDoc(objNode) Dim obj For Each obj In objNode MsgBox obj.ParentNode.nodeName & " : " & obj.NodeValue If obj.HasChildNodes Then dumpDomDoc obj.ChildNodes End If Next End Sub このコードですと、読み込んだXMLを一行づつメッセージボックスに延々と表示するだけなのですが、 例えば行先のXMLファイルにある<description>と</description>に囲まれた部分だけを変数に格納するにはどのように記述すればよろしいのでしょうか? ググってはみましたが知識不足の為、解説も理解できず困っております。 大変お手数ですがご教示いただけますようお願いします。

専門家に質問してみよう