- 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の設定を調べてみようと思います。
|