如何在Firefox扩展中将HTML字符串转换为DOM对象?

26

我正在使用XMLHttpRequest下载一个网页(标签soup HTML),我希望将输出转换为DOM对象,然后可以在其上运行XPATH查询。如何将字符串转换为DOM对象?

看起来通用的解决方案是创建一个隐藏的iframe,并将字符串内容放入其中。有人谈论更新DOMParser以支持text/html,但截至Firefox 3.0.1,如果尝试,则仍会出现NS_ERROR_NOT_IMPLEMENTED

除了使用隐藏的iframe技巧之外,还有其他选项吗?如果没有,那么最好的方法是如何执行iframe技巧,使您的代码在任何当前打开的标签页上下文之外都可以正常工作(这样关闭标签页就不会破坏代码等)?

是我正在寻找iframe hack以外解决方案的一个例子,如果必须编写所有的代码才能拥有强大的解决方案,那么我宁愿继续寻找其他东西。

5个回答

10

6

试试这个:

var request = new XMLHttpRequest();

request.overrideMimeType( 'text/xml' );
request.onreadystatechange = process;
request.open ( 'GET', url );
request.send( null );

function process() { 
    if ( request.readyState == 4 && request.status == 200 ) {
        var xml = request.responseXML;
    }
}

请注意overrideMimeTyperesponseXML
readyState == 4时,意味着已完成。


如果响应本身不是有效的XML,则此方法无法正常工作。如果您告诉Firefox期望XML,它将严格限制解析的内容。 - thelsdj

2
尝试创建一个 div。
document.createElement( 'div' );

然后将标签混乱的HTML设置为div的innerHTML。浏览器应该将其处理为XML,然后您可以解析它。

innerHTML属性接受一个字符串,该字符串指定文本和元素的有效组合。当设置innerHTML属性时,给定的字符串完全替换对象的现有内容。如果字符串包含HTML标记,则在放入文档时会对字符串进行解析和格式化。


这个问题在于我需要整个HTML文档,包括<head>等部分,但使用这种方法会将其丢弃。同时,我试图不使用现有的窗口/标签页,因为我的代码是在它们的上下文之外运行的,我希望对用户随意关闭窗口或标签页时具有一定的抵抗力(假设Firefox仍在运行)。 - thelsdj

1
所以您想使用JavaScript将网页下载为XML对象,但又不想使用网页?由于您无法控制用户会做什么(关闭选项卡或窗口等),因此您需要在像OSX Dashboard小部件或某些独立应用程序中进行此操作。Firefox扩展程序也可以工作,除非您担心用户关闭浏览器。

是的,我正在使用一个Firefox扩展,但大多数iframe示例使用任意浏览器窗口,而不是核心进程中的对象,以抵抗浏览器/标签页关闭。 - thelsdj

1
除了使用隐藏的 iframe 技巧外,还有其他选项吗?
很遗憾,现在没有。否则,你指向的微摘要代码就会使用它。
如果没有其他方法,最好的方法是如何执行 iframe 技巧,以便你的代码可以在任何当前打开的选项卡上下文之外运行(这样关闭选项卡就不会破坏代码等)?
你引用的代码使用最近的浏览器窗口,因此关闭标签页不会影响解析。关闭该浏览器窗口将中止加载,但你可以处理它(检测到加载被中止并在另一个窗口中重新启动它,例如),而且这种情况并不经常发生。
你需要 DOM 窗口才能使 iframe 正常工作,因此目前没有干净的解决方案(如果你想使用 mozilla 解析器)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接