Анализировать DOM в компоненте автозаполнения XPCOM

Я знаю, что мы должны использовать JSON при получении удаленных «предложений автозаполнения», но я вынужден использовать стандартный DOM действительный XHTML

Я зарегистрировал компонент интерфейса nsIAutoCompleteSearch и, используя этот код, получил удаленный XHTML через XmlHttpRequest

var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
        .createInstance(Components.interfaces.nsIXMLHttpRequest);

пока нормально. затем я получаю текст от request.responseText, и мне нужно проанализировать DOM и получить значения, слишком сложные с регулярным выражением

вот код с ошибкой:

Components.classes["@mozilla.org/feed-unescapehtml;1"]
                    .getService(Components.interfaces.nsIScriptableUnescapeHTML)
                    .parseFragment(request.responseText, false, null, document);

ошибка говорит document not defined. Поскольку я работаю в компоненте XPCOM, у меня нет доступа к DOM страницы или оверлеям XUL. Этот код взят прямо из документов MDN

Я пытался создать экземпляр nsIDOMDocument или nsIDOMHTMLDocument и загрузить их из @mozilla.org/dom/core;1 или @mozilla.org/dom/html;1, но кажется, что эти пакеты недоступны (ошибка говорит Components.classes['@mozilla.org/dom/core;1'] is undefined)

Итак, есть ли способ создать новый DOMDocument, вставить request.responseText как HTML, а затем пройтись по его структуре DOM?

функция HTMLParser из данной ссылки выдает ту же ошибку о document not defined

Спасибо


person Marek Sebera    schedule 08.09.2011    source источник


Ответы (1)


Если ответ сервера представляет собой правильно сформированный XHTML, вы можете просто использовать элемент responseXML объекта запроса.

Однако это работает только в том случае, если сервер возвращает тип содержимого text/xml. В противном случае вы можете принудительно указать тип MIME в text/xml, используя XMLHttpRequest.overrideMimeType. .

Последняя возможность - проанализировать документ вручную, как в исходном вопросе. Однако я бы использовал DOMParser. Вы можете использовать его из компонента XPCOM следующим образом:

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
  createInstance(Ci.nsIDOMParser);  
var doc = parser.parseFromString(aStr, "text/xml");
person Matthew Gertner    schedule 08.09.2011
comment
responseXML == null означает, что он неправильно сформирован? - person Marek Sebera; 09.09.2011
comment
Каков тип содержимого ответа? Это должен быть текст/xml. - person Matthew Gertner; 09.09.2011
comment
Content-Type:text/html; charset=UTF-8 и я не могу изменить серверную часть - person Marek Sebera; 09.09.2011
comment
так что я не могу использовать responseXML, не так ли? - person Marek Sebera; 10.09.2011
comment
@Мэттью: XMLHttpRequest.overrideMimeType? - person Wladimir Palant; 19.09.2011