Как создать объект DOM из html-страницы, полученной через XMLHttpRequest? - PullRequest
3 голосов
/ 20 октября 2010

Я разрабатываю расширение Chromium, поэтому у меня есть разрешения для нескольких хостов для запросов XMLHttp для доменов, для которых я запрашиваю разрешения.

Я использовал XMLHttpRequest и получил веб-страницу HTML(TXT / HTML).Я хочу использовать XPath (document.evaluate) для извлечения соответствующих битов из него.К сожалению, мне не удается создать объект DOM из возвращенной строки html.

var xhr = new XMLHttpRequest();
var name = escape("Sticks N Stones Cap");
xhr.open("GET", "http://items.jellyneo.net/?go=show_items&name="+name+"&name_type=exact", true);
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xhr.responseText,"text/xml");
    console.log(xmlDoc);
    }
}

xhr.send();

console.log для отображения отладочной информации в консоли Chromium JS.

В указанном JSприставка.Я получаю это:

Document
<html>​
<body>​
<parsererror style=​"display:​ block;​ white-space:​ pre;​ border:​ 2px solid #c77;​ padding:​ 0 1em 0 1em;​ margin:​ 1em;​ background-color:​ #fdd;​ color:​ black">​
<h3>​This page contains the following errors:​</h3>​
<div style=​"font-family:​monospace;​font-size:​12px">​error on line 1 at column 60: Space required after the Public Identifier
​</div>​
<h3>​Below is a rendering of the page up to the first error.​</h3>​
</parsererror>​
</body>​
</html>​

Итак, как мне предположить использовать XMLHttpRequest -> получить HTML -> конвертировать в DOM -> использовать XPath для трансверсального?

Должен ли я использовать "скрытый""iframe hack для загрузки / получения DOM-объекта?

1 Ответ

3 голосов
/ 20 октября 2010

DOMParser задыхается от определения DOCTYPE.Также будет ошибка на любой другой не-xhtml разметке, такой как <link> без закрывающей /.У вас есть контроль над отправляемым документом?Если нет, то лучше всего разбирать его как строку.Используйте регулярные выражения, чтобы найти то, что вы ищете.

Редактировать: Вы можете заставить браузер анализировать содержимое тела для вас, вставив его в скрытый div:

var hidden = document.body.appendChild(document.createElement("div"));
hidden.style.display = "none";
hidden.innerHTML = /<body[^>]*>([\s\S]+)<\/body>/i(xhr.responseText)[1];

Теперь ищите внутри hidden, чтобы найти то, что вы ищете:

var myEl = hidden.querySelector("table.foo > tr > td.bar > span.fu");
var myVal = myEl.innerHTML;
...