- PR -

responseXMLでのXMLデータ取得

投稿者投稿内容
X09A正義
会議室デビュー日: 2005/08/30
投稿数: 16
投稿日時: 2006-06-26 16:42
HTTP非同期通信を利用して
サーバからXMLデータを取得しようとしていますが、うまく取得できません。
原因の分かる方がいましたら、教えていただけないでしょうか?

動作環境

  • WebLogicServer 8.1J
  • サーバ:WindowsServer2003
  • クライアント:WindowsXp
  • ブラウザ:IE6.0


コード:
test.xml
<?xml version"1.0" encoding="UTF-8" ?>
<books>
  <book>
     <name>Java</name>
     <price>1500</price>
  </book>
  <book>
     <name>C</name>
     <price>2000</price>
  </book>
  <book>
     <name>VB</name>
     <price>1200</price>
  </book>
</books>



コード:
test.jsp
<script type="text/javascript">
<!--
    ・
    ・
    ・
    url = 'test.xml'
    httpObj = createXMLHttpRequest(func);
//IE6.0使用不可    httpObj.overrideMimeType('text/xml'); 
    if (httpObj) {
        httpObj.open('GET',url,true);
        httpObj.send(null);
    }
}

function putDateCallback()
{
    if (httpObj.readyState == 4) {
        if (httpObj.status == 200) {
            getXMLdata();
        }
        else {
            window.alert('ERROR' + httpObj.status);
        }
    }
}

function getXML()
{
    window.alert(httpObj.responseText);                      // @.テキスト形式でデータを表示
    xmlData = httpObj.responseXML;
    document.getElementById('test').innerHTML = xmlData;     // A.xmlオブジェクトをそのまま表示
    
    var targetNames = xmlData.getElementsByTagName('book');
    window.alert(targetNames.length);                        // B.bookの数を表示
    
    var bookNames = xmlData.getElementsByTagName('name');
    window.alert(bookNames.length);                          // C.nameの数を表示
    window.alert(bookNames[0].childNodes[0].nodeValue);      // D.nameの値を表示
}



上記の様なコードを実行した際に、getXML内で以下のような結果が表示されます。
@.期待:test.xmlの内容
結果:test.xmlの内容
A.期待:[object XMLDocument]
結果:[object]
B.期待:3
結果:0
C.期待:3
結果:0
D.期待:Java
結果:Cで0なのでindexERRORが発生する。

xmlの記述ミスを疑い、'test.xml'のアドレス直指定しましたが、
きちんとxmlとして表示されました。
var elem = httpObj.responseXML.Elements;
とすると、elemが[undefined]となるのですが、これが原因ではないかと思います。
POST送信するときに'Content-Type'を指定しないと、POSTパラメータが取れないと言う事象がありますが、
それと同様に、何か設定が必要なのでしょうか?
ご存知でしたら、ご教授をお願いいたします。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-06-26 18:35
引用:

X09A正義さんの書き込み (2006-06-26 16:42) より:
var elem = httpObj.responseXML.Elements;
とすると、elemが[undefined]となるのですが、これが原因ではないかと思います。


確か、responseXML.documentElementじゃなかったかな?

# 今の環境に入っていなくても、firefoxのDOM Inspectorは便利だから、入れるだけの価値アリ。
X09A正義
会議室デビュー日: 2005/08/30
投稿数: 16
投稿日時: 2006-06-27 10:38
冬寂有難うございます。

確かにresponseXML.documentElementで取得したオブジェクトに対して、
getElementsByTagNameを実行して値を取得しているページを見たことがありました。

但し、httpObj.responseXML.documentElementを実行すると
戻り値がnullになってしまう状況です。

クライアントばかりを疑っているのですが、
サーバからのダウンロードが上手くいっていない可能性を疑うべきかな?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-06-27 12:05
出たことがないので分かりませんが、responseのcontentTypeが"text/xml"になってないとか。
X09A正義
会議室デビュー日: 2005/08/30
投稿数: 16
投稿日時: 2006-06-27 15:21
mioさまありがとうございます。

responseのcontentTypeが"text/xml"になってないという可能性は考えて、
overrideMimeType('text/xml')を使用しましたが、
Msxml2.XMLHTTPではサポートしていないメソッドの為ダメでした。

以下のサイトで判定する限り、特に指定しなくても使用できると思うのですが

Content-Type: 許容判定

Ajaxのサンプルサイトのサンプルを動かす限り、responseXMLでデータ取得できていますので、
サーバをweblogic以外に変更して引き続き調査してみようと思います。
未記入
常連さん
会議室デビュー日: 2005/07/04
投稿数: 31
投稿日時: 2006-06-27 16:09
responseTextの方もnullですか?

あと

引用:
Ajaxのサンプルサイトのサンプルを動かす限り、responseXMLでデータ取得できていますので、
サーバをweblogic以外に変更して引き続き調査してみようと思います。



が自前のweblogicサーバで動いてるなら、サーバは関係ないと思いますよ。

それと明らかに会議室違いなのに誰も突っ込まないのは何故?
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-06-27 20:23
引用:

未記入さんの書き込み (2006-06-27 16:09) より:
それと明らかに会議室違いなのに誰も突っ込まないのは何故?


WebLogicServer 8.1J とあるから、一応Javaトピックでもいいんじゃないかな?と。
(まぁ、どっちかと言うとリッチクライアントの方が望ましいけど。)

それはともかくとして、気になる点は、先にも挙げた
引用:

var elem = httpObj.responseXML.Elements;


とかやっている所。
Elementsというのは明らかにDOMの関数、属性じゃなさそうですよね?
(getElementByIdとか見れば分かる通り、名前にcamel case使ってる筈だし。)
独自のライブラリとか使ってるのでは無いですか?

(それとも、これがWebLogicServerってので使ってるAjax用のライブラリなのかな?)
X09A正義
会議室デビュー日: 2005/08/30
投稿数: 16
投稿日時: 2006-06-28 11:48
冬寂さん、未記入さんご指摘ありがとうございます。

順不同の回答になりますがご了承ください。

引用:
明らかに会議室違いなのに誰も突っ込まないのは何故?



Javaの掲示板に記載したのはどちらかと言うと、
WebLogicの設定を疑っているからです。
サンプルサイトのresopnseXMLが動いているところからも、
WebLogicからのresopnseが怪しいと考えられましたので・・・
mioさんの発言にある「responseのcontentTypeが"text/xml"になってないとか」と言う点で、
getResponseHeader('Content-Type')を実行してみましたが、contentTypeはヘッダ情報にはありませんでした。
jspでcontentType"text/xml"を宣言してみる方法も試すと、
ヘッダ情報にcontentTypeは含まれるようになったのですが、データ取得は出来ませんでした・・・

引用:
responseTextの方もnullですか?


これは初稿でも書いてあるとおり、xmlの内容がそのまま表示されます。


引用:
WebLogicServer 8.1J とあるから、一応Javaトピックでもいいんじゃないかな?と。 (まぁ、どっちかと言うとリッチクライアントの方が望ましいけど。)



セッション数&ネットワークトラフィック(アプレット)の観点から、
JMSトピックは使わない方針でやっています。

引用:

var elem = httpObj.responseXML.Elements;
とかやっている所。
Elementsというのは明らかにDOMの関数、属性じゃなさそうですよね?
(getElementByIdとか見れば分かる通り、名前にcamel case使ってる筈だし。)
独自のライブラリとか使ってるのでは無いですか?
(それとも、これがWebLogicServerってので使ってるAjax用のライブラリなのかな?)



これは誤記です。すみません。
httpObj.responseXML.Elements==[undefined]
⇒httpObj.responseXML.documentElement==null
が正しかったです。
今回は、独自のライブラリは使用していないです。

引用:
サンプルが自前のweblogicサーバで動いてるなら、サーバは関係ないと思いますよ。


サンプルは自サーバで動かしたのではありません。
以下のサイトの物を動かしました。
XML読込み
IEの設定に社内のスクリプトを使っているのでそれが原因かな?と思いましたので・・・

無記入さんの指摘の後、
WebLoigcに上記サイトソースをコピペして実行しました。
(今まではjsp&xmlでしたので、html&xmlで)
この時、以下のように一部変更して・・・
コード:
function displayData()
{
	if ((httpObj.readyState == 4) && (httpObj.status == 200))
	{
		xmlData = httpObj.responseXML;
		userListTags = xmlData.getElementsByTagName("user");
		numberListTags = xmlData.getElementsByTagName("number");
		usernameListTags = xmlData.getElementsByTagName("username");

		userLen = userListTags.length;	// 登録されているユーザー数
		resultText = "";	// データの内容を表示するための変数
		/**-----------変更点 strat-----------**/
		if (userLen==0) {
			$("result").innerText=httpObj.responseText;
			return;
		}
		/**-----------変更点  end -----------**/
		for(i=0; i<userLen; i++){
			num = numberListTags[i].childNodes[0].nodeValue;
			uname = usernameListTags[i].childNodes[0].nodeValue;
			resultText = resultText + num + " : " + uname + "<br>";
		}
		$("result").innerHTML = resultText;
	}else{
		$("result").innerHTML = "<b>Loading...</b>";
	}
}



結果はXMLの内容がそのまま表示されてしまいました。
上記、サンプルの説明ページである
[url=http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter02/009/index.html]説明[url]
で中盤に書かれている
引用:
上記のプログラムを実行するとページ上には[object XMLDocument]


で[object]と表示されてしまう件が、初稿のAに相当します。

以上のことから、もう少しWebLogicの設定を調べてみようと思います。

スキルアップ/キャリアアップ(JOB@IT)