2016-11-21 11 views
1

私は、同じサイトから別のページの変数の内容にロードし、(XMLをパース)その内容からデータを取得するためにJavaScriptでなければなりません。解析のXMLHttpRequest(XPathを使用して)()結果

私はXMLHttpRequestを()とresponseTextプロパティを使用して、テキスト文字列変数にページのHTMLを頂いております。

その後I XMLオブジェクト(DOMParserに)にテキスト文字列を変換し、XPathを使用しようとしました。

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

どのように変換することができますXMLHttpRequestを()documentオブジェクトのXPathを使用して、それを処理するために結果:Firefoxのコンソールで

私は、エラーを見ましたか? このオブジェクトで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

まず、このすべて:すべてのブラウザにはかなりの時間がネイティブXMLHttpRequestオブジェクトを実装しているため

var req = new XMLHttpRequest(); 

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

はちょうどこの置き換えることができます。

第二に、あなたはあなたの応答を取得する際に、XHR ませresponseText財産responseXMLresponseXML)プロパティでそれを探します。これにより、XML応答のノードを含むDocumentオブジェクトが返されます。このDocumentオブジェクトは、必要に応じてCore DOMまたはXML Parserを使用して解析できます。しかし、現時点でresponseTextのプロパティを使用しているため、DOMパーサはそれに酔っています。

+0

おかげで私は(私の答えを参照)完全にこのタスクを解決し – Leax

+1

@Leaxあなたはそれを解決聞いてそれはキリル文字記号のように聞こえるうれしいです。その文字列がXMLとして認識されないようにしていました。有効なXML文書があれば、 'responseXML'データを取得するためのプロパティです。 –

2

このタスクでは、いくつかの瞬間がありました:

  • は、プロパティのresponseXMLはreq.overrideMimeTypeを使用せずに(Firefoxで)同じヌルとなっています。 req.overrideMimeType-プロパティの使用を開始した後、responseXMLはすでにnullではありませんが、XPathを正しく使用できませんでした。したがって、私はresponseTextプロパティとDOMParserを使用しました。
  • 我々はない メイン文書オブジェクトについて、作成されたのHTMLDocumentオブジェクト上でそれを使用する必要がありますdocument.evaluate メソッドを使用すると、
  • あり、ロードされた ページのキリル文字記号があるので、私はXPathを使用する文字セットの窓-1251の結果を取得する必要があります適切に

最終的な結果は次のとおりです。

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 
} 
関連する問題