0

ユーザー/PWで保護されたURLからXMLリソースをロードして解析する必要がある場合、私が知る限り、MSXML DOM.Load()を使用することはできません。クレデンシャルを指定する場所はありません。

ただし、XMLHTTPRequestを使用してリソースを取得してDOMに解析する場合(.responseXMLプロパティを介して)、.resolveExternalsプロパティの値を指定する場所がありません。

これは、MSXML 3、4(または5)を使用してデフォルトでTrueに設定されている場合に多かれ少なかれ機能しますが、MSXML6ではデフォルトでFalseに設定されています。

resolveExternalsプロパティ

MSXML 3.0、MSXML 4.0、およびMSXML 5.0では、デフォルトのresolveExternals 値はTrueです。MSXML 6.0では、デフォルト設定はFalseです。

このプロパティがFalseに設定されている場合、外部インクルードとインポートは解決されません。

私が見ていないこれを回避する方法はありますか?通常、特にXSDまたはWSDLを処理する場合は、外部を解決する必要があります。

または、私は自分自身をだましていて、XMLHTTPRequest(DOM.Load()呼び出しのみ)を使用する場合、おそらく.resolveExternalsは適用されませんか?

4

1 に答える 1

1

このようなことを試しましたか?

xmlhttp.responseXML.resolveExternals = true; 
xmlhttp.responseXML.setProperty("ProhibitDTD", false);

唯一のことは、ソリューションがMSXMLXMLHTTPActiveXオブジェクトでのみ機能する可能性があることです。

編集:これはIE9の具体的なサンプルです:

var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.6.0");
// var xmlhttp = new XMLHttpRequest();

xmlhttp.open("GET", "sample.xml", false);
xmlhttp.responseXML.async = false;
xmlhttp.responseXML.resolveExternals = true;
xmlhttp.responseXML.validateOnParse = false;
xmlhttp.responseXML.setProperty("ProhibitDTD", false);
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readystate == 4 && xmlhttp.status == 200) {
         alert(xmlhttp.responseXML.xml);
    }
}
xmlhttp.send();

sample.xml

<!DOCTYPE data SYSTEM "sample.dtd"><data>&ent;</data>

sample.dtd

<!ENTITY ent "Hello world!">

上記のコードをIE9で実行すると、エンティティが正常に解決されます。ただし、コメント化されたXMLHttpRequestに切り替えると、失敗します。

PS:IE内のスクリプトについて話していると思いましたが、XmlHttpActiveXコンポーネントとはまったく異なるXMLHttpRequestと呼ばれるTridentネイティブコンポーネントがあります。ただし、MSXML6.DLLにあるIXMLHttpRequest COMインターフェイスを参照している場合は、上記のコードをC++に簡単に変換できます。

于 2011-07-27T02:42:30.063 に答える