2016-11-21 4 views
1

Ich brauche in JavaScript, um Variableninhalte einer anderen Seite von der gleichen Website zu laden und dann Daten von diesem Inhalt (Parse XML).Parsing XMLHttpRequest() Ergebnis (mit XPath)

Ich habe Textvariable Variable der Seite HTML mit XMLHttpRequest() und responseText -Eigenschaft bekommen.

Danach konvertierte ich Textzeichenfolge in XML-Objekt (DOMParser) und versuchte, XPath zu verwenden.

In FireFox Konsole sah ich Fehler:

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

Wie kann ich XMLHttpRequest konvertieren() in Dokumentobjekt führt es mithilfe von XPath zu verarbeiten? Wie sollte ich document.evaluate mit diesem Objekt verwenden? Gibt es den einfacheren Weg, meine Aufgabe zu erledigen?

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

auf die 'evaluate' Methode verwenden Ihr 'xml' Dokument - dh' xml.evaluate (xpath, ... ' –

Antwort

1

Zuerst alles:

var req = new XMLHttpRequest(); 

Da hat jeder Browser eine native XMLHttpRequest Objekt schon seit geraumer Zeit umgesetzt:

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'); 

mit nur diese ersetzt werden.

Zweitens, wenn Sie Ihre Antwort erhalten, sucht es in der responseXML (responseXML) Eigenschaft der XHR NICHT die responseText Eigenschaft. Dadurch wird ein Document-Objekt zurückgegeben, das die Knoten der XML-Antwort enthält, die Sie dann mit dem Core-DOM oder einem XML-Parser analysieren können. Aber da Sie die responseText-Eigenschaft im Moment verwenden, erstickt Ihr DOM-Parser darauf.

+0

Danke für die Hilfe! Ich löste diese Aufgabe vollständig (siehe meine Antwort) – Leax

+1

@Leax Ich bin froh zu hören, dass du es gelöst hast. Es klingt wie die kyrillischen Symbole verhinderten, dass die Zeichenfolge als XML erkannt wurde. Nur zur Bestätigung, wenn Sie ein gültiges XML-Dokument hatten, dann "responseXML" wäre die Eigenschaft, um die Daten zu erhalten. –

2

Es gab einige Momente in dieser Aufgabe:

  • Property responseXML war gleich null (in FireFox) ohne req.overrideMimeType zu verwenden. Nachdem ich die req.overrideMimeType-Eigenschaft verwendet habe, ist responseXML noch nicht null, aber ich konnte XPath immer noch nicht korrekt verwenden. Daher habe ich responseText-Eigenschaft und DOMParser verwendet;
  • Wenn wir document.evaluate Methode verwenden, sollten wir es auf HTMLDocument-Objekt verwenden, das erstellt wurde, nicht für Hauptdokumentobjekt;
  • Es gibt Kyrillisch Symbole auf geladene Seite, also sollte ich in der charset windows-1251 führen erhalten XPath richtig ist

Endergebnis zu verwenden:

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 
}