使用GM_xmlhttpRequest获取xml

时间:2010-08-04 17:58:42

标签: javascript xml dom xmlhttprequest greasemonkey

我正在尝试使用greasemonkey检索页面,然后从中提取链接,将链接插入当前页面。我遇到了一些麻烦:

GM_xmlhttpRequest({
method: "GET",
url: "http://www.test.net/search.php?file=test",

onload: function(data) 
{
    if (!data.responseXML) 
    {
        data.responseXML = new DOMParser().parseFromString(data.responseText, "text/xml");
    }
    alert("!");
    var xmldata = data.response.xml;
    var tests = xmldata.getElementsByTagName('test');
    alert(tests[0].innerHTML);
}

});

该页面有效,GM_xmlhttpRequest在我之前尝试时将其正确地作为字符串返回,但我似乎无法弄清楚如何制作它以便我可以在其上使用节点操作。提前谢谢。

编辑 - 第二个相关问题

我应该如何引用当前页面以便将其传递给函数,就像我传递获取的页面一样?实施例

function FindTests(currentpage)
{
    currentpage.getElementById('blah');
}

最初我传递文档,但后来我使用了获取的页面。对不起,如果措辞令人困惑。

1 个答案:

答案 0 :(得分:2)

如果请求的页面是格式良好的xml,那么你的方式是正确的。
但是您应该将data.response.xml更改为data.responseXML

和我认为你不能用XMLDocument(xml解析器的结果)来执行此操作,因为.getElementById适用于HTMLDocument
但是,您可以执行以下操作以获得有效的HTMLDocument:

if (/^Content-Type: text\/xml/m.test(data.responseHeaders)) {
    data.responseXML = new DOMParser().parseFromString(data.responseText, "text/xml");
}
else if (/^Content-Type: text\/html/m.test(data.responseHeaders)) {
    var dt = document.implementation.createDocumentType("html", "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd");
    var doc = document.implementation.createDocument(null, null, dt);

    // I have to find a workaround because this technique makes the html*/head/body tags to disappear.  
    var html = document.createElement('html');
    html.innerHTML = data.responseText;
    doc.appendChild(html);

    data.responseXML = doc;
}

来源:http://userscripts.org/scripts/review/56489