在 XPCOM 自动完成组件中解析 DOM
我知道在接收远程“自动完成建议”时我们应该使用 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 文档
我尝试创建实例nsIDOMDocument
或 nsIDOMHTMLDocument
并从中加载它们@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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果服务器响应是格式良好的 XHTML,则可以仅使用请求对象的responseXML 成员。
但是,只有当服务器返回内容类型 text/xml 时,这才有效。否则,您可以使用 XMLHttpRequest.overrideMimeType 强制 MIME 类型为 text/xml 。
最后一种可能性是像原始问题一样手动解析文档。不过,我会使用 DOMParser 。您可以从 XPCOM 组件中使用它,如下所示:
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: