2011-07-21 31 views
0

如果必須從用戶/ PW保護的URL加載和分析XML資源,則不能只使用MSXML DOM.Load()。沒有地方可以指定憑證。MSXML 6,User/PW Auth,ResolveExternals

但是,如果您使用XMLHTTPRequest獲取資源並將其解析爲DOM(通過其.responseXML屬性),則無處可指定.resolveExternals屬性的值。

這或多或少的作品出來的時候,使用MSXML 3,4,(或者甚至5),在此默認爲真,但是在MSXML 6個默認爲false:

resolveExternals Property

在MSXML 3.0,MSXML 4.0和MSXML 5.0中默認resolveExternals 值爲True。在MSXML 6.0中,默認設置爲False。

如果此屬性設置爲False,則不會解析外部包含並導入 。

有沒有解決方法,我沒有看到?通常我需要解決外部問題,特別是在處理XSD或WSDL時。

或者我是在自欺欺人,或許.resolveExternals在使用XMLHTTPRequest(僅限DOM.Load()調用)時從不應用?

回答

1

你有沒有試過類似的東西?

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

唯一可能的解決方案可能只適用於MSXML XMLHTTP ActiveX對象。

編輯:這裏是一個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中的腳本,並且有一個名爲XMLHttpRequest的Trident本地組件,它與XmlHttp ActiveX組件非常不同。但是,如果您引用駐留在MSXML6.DLL中的IXMLHttpRequest COM接口,則可以輕鬆地將上述代碼轉換爲C++。

+0

你稱之爲「MSXML XMLHTTP ActiveX對象」的東西和XMLHTTPRequest是一樣的,我認爲你得到的ProgId與它的類名混淆。據我所知,在實際做一個.send之前,你不能在它的.responseXML上設置一個屬性,並且我認爲(A)太晚了,(B)如果它在.send之後工作,它可能會再次未能使用憑證。 – Bob77

+0

嗨鮑勃,我已經編輯了一個工作示例的答案。讓我知道這是否適合你。 –

+0

是的,我意識到Trident後來自己添加了(IE7?)。對不起,我對此並不清楚。它似乎沒有任何影響,但我會更徹底地檢查。如果你的事件處理程序正在工作,其餘的應該也是。謝謝。 – Bob77