web-dev-qa-db-ja.com

responseXMLは常にnull

私はFirefox 3.6.10とFirebugを使用してデバッグしています

だから、これが私のコードです:

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url,false);
xmlhttp.setRequestHeader('Content-Type',  'text/xml');
xmlhttp.send(null);
alert(xmlhttp.responseXML);

responseXMLは常にnullであり、異なるドメインの複数のURLで試してみました。私も非同期で試しましたが、同じ結果です。 responseTextは常に適切に返され、問題はありません。

私の目標はresponseXML.documentElementを取得することです。

ご協力いただきありがとうございます。

編集-----------
このjavascriptコードはGreasemonkeyユーザースクリプトから実行されたため、リクエストされたURLと同じOriginを表示しました。また、Firebugコンソールから実行してみて、Originポリシーを確認しました。両方で同じエラー。
Javascriptが嫌いです。

18
WoF_Angel

同じOriginポリシーに違反しているに違いない。

XHRの場合、同じプロトコル、ドメイン、ポートなどが必要です。そのため、localhost:8080/appでアプリを実行している場合、www.cnn.comに接続できません。

ブラウザによって、これは異なる方法で処理されます。私はFFがあなたが説明することをするのを見ました、それはリクエストが正常に戻るように見えますが、データがありません...

8
hvgotcodes

すでに述べたクロスドメインの問題に加えて、responseXMLには完全に有効なXMLと、おそらくサーバーから送信される応答ヘッダー内の正しいContent-Typeが必要です。これらの要件のいずれかが平均的なWebサイトで満たされることはほとんどありません。

後者の問題については、使用できます

xmlhttp.overrideMimeType('application/xml');

リクエストを送信する前に、レスポンスを強制的にXMLとして解釈します。それでも応答が有効なXMLでない場合は、nullのみを取得します。

25
MooGoo

私が正しく思い出せば、これはFirefoxの既知の問題です(以前に同じ問題がありました)。

修正は、responseTextを解析してXMLドキュメントに戻し、これを使用することです。

このようなもの :

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml");
19
Kenny

urlの値をブラウザーで直接開いてみてください。エラー情報が表示されます。
解析エラーが表示された場合は、エンコーディングが間違っている可能性があり、XMLに特殊文字が含まれているため無効になっている可能性があります。

これを回避するには、すべてのチェーンが適切にエンコードされていることを確認する必要があります。

静的XMLファイルの場合は、保存時にエディターのエンコードを正しく設定する必要があります。それをすべて行うエンコーディング(ほとんど)はUTF-8です。これは通常、エディター設定または保存ダイアログで選択できるプロパティです。

動的に生成される場合。データ、ページ、サーバーの応答も適切にエンコードする必要があります。そして、XMLは<?xml version="1.0" encoding="UTF-8"?>で始まります

最初に、非常に基本的で静的なXMLを試すことができます。

<?xml version="1.0" encoding="UTF-8"?><root>hi</root>

そして、それを壊すことなく、あなたのようにするために、ステップを一つずつ追加してください。

5
Mic

これを何時間もいじって、ついに私を混乱させている愚かな小さなエラーを見つけました...

私のような人なら、JavaScriptコードを外部の「.js」ファイルに保存するのが好きです。

そのため、xmlhttp.open( "GET"、 "yourxmlfile.xml"、false)を使用すると、常に検索されます hTMLドキュメントに関連するXMLファイル、コードが外部JavaScriptファイル内にある場合でも。

ResponseTextがnullを返す場合、ローカルファイルは指定されたパスの場所で見つかりませんでした。また、asyncがtrueに設定されている場合、ファイルが作成され、応答テキストには空のXMLドキュメントのコンテンツが含まれます。

例:

xmlDoc = xmlhttp.responseText; //文字列データ型

        or

xmlDoc = xmlhttp.responseXML; // XMLデータ型

  • folder1 = folder2、index.html。
  • folder2 = index.js、yourxmlfile.xml。
  • hTMLからXMLへのパス=「yourxmlfile.xml」ではなく「folder2/yourxmlfile.xml」.

そして、開いてからリクエストを送信する前に、XMLドキュメントを「text/xml」に解析することを忘れないでください。

例:

  • xhttp.overrideMimeType( 'text/xml');
  • Chrome:xmlDoc =(new DOMParser())。parseFromString(xmlDoc、 "text/xml");
1
CENTRI

私にとってそれは単純な問題でした。 xml/phpファイルに構文エラーがありました。ブラウザでファイルを表示しても、ブラウザはエラーを検出しませんでした。

XMLドキュメント内の要素が適切に閉じられていることを確認してください!

0
CENTRI

正しいxmlの例を見つけるのに苦労しました。 nullを取得した場合は、XML Validatorを試してください。私にとっては<root>要素がありませんでした。

<root>
<info><p>Array
(
)
</p>
</info>
<itemData>{"id":"40","client_id":"1","nameUnique":"Lore ipsum","description":null,"userComment":null,"last_modified":"2018-12-15 02:48:57"}    </itemData>
</root>
0

不正なXML 任意の種類がこの問題の原因になります。たとえば、無効な属性renderer="something"なし)があり、DOMParser-XMLHTTPRequestによって呼び出されます-が窒息します。したがって、loadイベントにはテキスト応答が含まれますが、XMLは含まれません。

0
Engineer