无法在Windows 8应用中获取Feed

时间:2012-10-12 08:50:01

标签: javascript rss windows-8 winjs feedburner

我正在使用RSS Feed为Windows 8创建博客阅读器应用程序。部分代码:

function downloadBlogFeed() {
    WinJS.xhr({ url: "http://feeds.feedburner.com/CssTricks" }).then(function (rss) {
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("thumbnail");
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[1].attributes.getNamedItem("url").textContent;
                article.content = items[n].textContent;
                articlesList.push(article);
            }
        }
    });
}

因此,我的应用无法从FeedBurner读取Feed。我收到此错误

  

无法加载http://feeds.feedburner.com/~d/styles/itemcontent.css。应用无法在本地环境中加载远程Web内容。

我已尝试http://feeds.feedburner.com/CssTricks?format=xmlhttp://feeds.feedburner.com/CssTricks?fmt=xml,但同样的错误。

编辑:完整代码:http://jsfiddle.net/8n67y/

2 个答案:

答案 0 :(得分:2)

您遇到的错误不是因为您无法从Feedburner中读取。这是因为您尝试加载到DOM中的内容中的某个地方是对Web上的CSS文件的引用(itemcontent.css)。

当您在本地环境中操作时,无法从Web动态加载脚本或CSS,因为这会在本地环境中带来安全风险。

见这里:

http://msdn.microsoft.com/en-us/library/windows/apps/hh465380.aspx

在这里:

http://msdn.microsoft.com/en-us/library/windows/apps/hh465373.aspx

有关本地和Web上下文之间差异的更多信息,以及适用于每个上下文的限制。

对于您的特定情况,我认为您应该尝试进一步解析内容(您可以在上面的代码中设置断点来检查Feed返回的XML内容)以确定返回CSS文件引用的位置并以编程方式删除它,如果它在一致的位置,或者找到另一种消除CSS引用的方法,这似乎是导致异常的原因(基于上面的有限信息)。

答案 1 :(得分:0)

您尝试执行的操作可以使用以下代码完成,而不是WinJS.xhr使用xmlHTTPRequest。

以下代码是我使用我的RSS阅读器的代码的一部分,它在所有情况下都能很好地工作,我们可以下载图片,文本,链接......无论你在Feed中找到什么(http://feeds.feedburner.com/CssTricks)得到缩略图,一切正常。

我也通过以下修改测试了它,

function connectToURL() {
    var url = "";

    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null) {
         return;
    }   

    xmlHttp.onreadystatechange = stateChanged;
    xmlHttp.open("GET", url,true);
    xmlHttp.send(null);
}

// your job will actually start on this one...
function stateChanged() {
        if(xmlHttp != null )
            if (xmlHttp[item.key].readyState == 4 ) {
                try {
                    var xmlDoc = xmlHttp.responseXML.documentElement.getElementsByTagName("TAGYOUWANTTOGET");
                    for (var i = 0; i < xmlDoc.length; i++) {
                       xmlDoc[i].getElementsByTagName("TAG")[0].childNodes[0].nodeValue
                    }
                } catch (e) {
                   //work on the exception
                }
            }
        }     
}

function GetXmlHttpObject() {
    var xmlHttp = null;
    try {
        xmlHttp = new XMLHttpRequest();
    }
    catch(e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    return xmlHttp;
}