2016-11-21 271 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 
}