2016-11-21 12 views
1

Мне нужно в JavaScript для загрузки в содержимое переменной другой страницы с того же сайта, а затем получить данные из этого содержимого (проанализировать XML).Анализ XMLHttpRequest() result (using XPath)

Я получил в текстовой строке переменную HTML страницы с использованием свойств XMLHttpRequest() и responseText.

После этого я преобразовал текстовую строку в объект 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 объект в течение некоторого времени.

Во-вторых, когда вы получите ваш ответ, искать его в собственность responseXML (responseXML) от XHR не является responseText собственности. Это вернет объект Document, содержащий узлы ответа XML, который вы можете проанализировать с помощью Core DOM или XML Parser, если хотите. Но поскольку вы используете свойство responseText на данный момент, ваш DOM Parser задыхается.

+0

Спасибо за помощь! Я полностью решил эту задачу (см. мой ответ) – Leax

+1

@Leax Рад, что вы это решили. Это звучит как кириллица препятствовали тому, чтобы строка распознавалась как XML. Просто FYI, если у вас есть действительный XML-документ, тогда 'responseXML' будет собственностью для получения данных. –

2

Был некоторые моменты в этой задаче:

  • недвижимости responseXML была равна NULL (в FireFox) без использования req.overrideMimeType. После того, как я начал использовать req.overrideMimeType- свойство responseXML уже не null, но я не смог корректно использовать XPath. Таким образом, я использовал свойство responseText и DOMParser;
  • Когда мы используем метод document.evaluate , мы должны использовать его на объекте HTMLDocument, который был создан, а не для основного объекта документа;
  • Есть кириллицы на загруженном страницы, так что я должен получить результат в кодировки Windows-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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^