在 XPCOM 自动完成组件中解析 DOM

发布于 2024-12-03 10:34:42 字数 1337 浏览 0 评论 0原文

我知道在接收远程“自动完成建议”时我们应该使用 JSON,但我被迫使用标准 DOM 有效的 XHTML

我已经注册了接口 nsIAutoCompleteSearch 的组件并使用此代码,通过 XmlHttpRequest 获取远程 XHTML

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未定义。因为我在 XPCOM 组件中,所以我无法访问页面的 DOM 或 XUL 覆盖层。此代码直接取自 MDN 文档

我尝试创建实例nsIDOMDocumentnsIDOMHTMLDocument 并从中加载它们@mozilla.org/dom/core;1@mozilla.org/dom/html;1,但这些包似乎无法访问(错误提示 < code>Components.classes['@mozilla.org/dom/core;1'] 未定义)

那么有没有办法创建新的 DOMDocument,插入 request.responseText 作为 HTML然后遍历它的DOM结构?

给定链接中的函数 HTMLParser 抛出有关 document not Defined 的相同错误,

谢谢

I know we should use JSON when receiving remote "autocomplete suggestions", but I'm forced to use standard DOM valid XHTML

I have registered component of interface nsIAutoCompleteSearch and using this code, to get remote XHTML via XmlHttpRequest

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

so far OK. then I receive text from request.responseText and I need to parse DOM and get values, too overcomplicated with regexp

so here is a code with error:

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

error saying document not defined. Because I'm in XPCOM component, I don't have access to DOM of page or XUL overlays. This code is taken right from MDN Docs

I tried to create instance of nsIDOMDocument or nsIDOMHTMLDocument and loading them from @mozilla.org/dom/core;1 or @mozilla.org/dom/html;1, but these packages doesn't seem to be accessible (error saying Components.classes['@mozilla.org/dom/core;1'] is undefined)

So Is there a way how to create new DOMDocument, insert request.responseText as HTML and then walk through its DOM structure?

function HTMLParser from given link is throwing same error about document not defined

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墨离汐 2024-12-10 10:34:42

如果服务器响应是格式良好的 XHTML,则可以仅使用请求对象的responseXML 成员。

但是,只有当服务器返回内容类型 text/xml 时,这才有效。否则,您可以使用 XMLHttpRequest.overrideMimeType 强制 MIME 类型为 text/xml 。

最后一种可能性是像原始问题一样手动解析文档。不过,我会使用 DOMParser 。您可以从 XPCOM 组件中使用它,如下所示:

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
  createInstance(Ci.nsIDOMParser);  
var doc = parser.parseFromString(aStr, "text/xml");

If the server response is well-formed XHTML, you can just use the responseXML member of the request object.

This only works if the server is returning content type text/xml, however. Otherwise you can force the MIME type to text/xml using XMLHttpRequest.overrideMimeType.

A final possibility is to parse the document manually as in the original question. I would use DOMParser though. You can use it from an XPCOM component like this:

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
  createInstance(Ci.nsIDOMParser);  
var doc = parser.parseFromString(aStr, "text/xml");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文