2016-11-21 266 views
1

我需要在JavaScript中加載來自同一站點的另一個頁面的變量內容,然後從該內容獲取數據(解析XML)。解析XMLHttpRequest()結果(使用XPath)

我已經在文本字符串變量中使用XMLHttpRequest()和responseText屬性獲取頁面的HTML。

之後,我將文本字符串轉換爲xml對象(DOMParser)並嘗試使用XPath。

在FireFox的控制檯,我看到錯誤:

Node cannot be used in a document other than the one in which it was created

我如何轉換的XMLHttpRequest()結果放入文檔對象使用XPath來處理呢? 我該如何使用document.evaluate和這個對象?有更簡單的方法來完成我的任務嗎?

textString=file_get_contents('my url'); 
var parser = new DOMParser(); 
xml = parser.parseFromString(textString, "text/xml"); 

list = getI("(//td[contains(text(), 'Total:')])[1]",xml); 
// Error: Node cannot be used in a document other than the one in which it was created`enter code here`  
// HOW USE getI function here? (document.evaluate) 

function file_get_contents(url) { // Reads entire file into a string 
    // 
    // + original by: Legaev Andrey 
    // %  note 1: This function uses XmlHttpRequest and cannot retrieve resource from different domain. 

    var req = null; 
    try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { 
     try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { 
      try { req = new XMLHttpRequest(); } catch(e) {} 
     } 
    } 
    if (req == null) throw new Error('XMLHttpRequest not supported'); 

    req.open("GET", url, false); 
    req.send(); 

    return req.responseText; 
} 

function getI(xpath,elem){return document.evaluate(xpath,(!elem?document:elem),null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);} 
+1

上使用'evaluate'方法你的'xml'文件 - 也就是'xml.evaluate(xpath,...' –

回答

1

首先,這一切:

var req = null; 
try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { 
    try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { 
     try { req = new XMLHttpRequest(); } catch(e) {} 
    } 
} 
if (req == null) throw new Error('XMLHttpRequest not supported'); 

可以與眼前這個替代:

var req = new XMLHttpRequest(); 

因爲每個瀏覽器已經實現本地XMLHttpRequest對象相當長的一段時間。

其次,當你得到您的回覆,尋找它在XHR NOT的responseText財產responseXMLresponseXML)屬性。這將返回一個包含XML響應節點的Document對象,您可以使用Core DOM或XML解析器進行解析,如果您願意的話。但是由於您現在正在使用responseText屬性,因此您的DOM解析器對此感到窒息。

+0

感謝您的幫助!我完全解決了這個任務(請參閱我的回答) – Leax

+1

@Leax很高興聽到您解決了它,聽起來像西裏爾字母正在阻止該字符串被識別爲XML。僅供參考,如果您有一個有效的XML文檔,則爲'responseXML'將是從中獲取數據的屬性。 –

2

有在這個任務中某些時刻:不使用req.overrideMimeType

  • 物業的responseXML已經等於空(在Firefox)。在我開始使用req.overrideMimeType-屬性之後,responseXML已經不是空的,但我仍然無法正確使用XPath。因此我使用了responseText屬性和DOMParser;
  • 當我們使用document.evaluate 方法時,我們應該在創建的HTMLDocument對象上使用它,而不是用於主文檔對象的 ;
  • 有加載 頁面上西裏爾字母的符號,所以我應該有導致字符集窗口-1251使用XPath正常

最後的結果是:

req = new XMLHttpRequest(); 
req.open("GET", 'http://my_url', false); 
req.overrideMimeType('text/xml; charset=windows-1251'); // for Cyrillic 
req.send(null); 

var parser = new DOMParser(); 
var xmlDoc = parser.parseFromString(req.responseText, "text/html"); 

var list = xmlDoc.evaluate("(//td[contains(text(), 'Total (Всего):')])[1]",xmlDoc,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 
if(list.snapshotLength>0){ 
// operations 
}