XML到JSON代理服务器未获取XML提要


XML to JSON proxy server not fetching XML feed

我正试图使用wordpress提供的RSS提要将wordpress博客中的帖子显示到远程网站上。但是,当然,我不得不设法避开CORS。因此,我现在正试图用PHP创建一个XML到JSON的代理服务器,并将此资源用作指南。

以下是我为输出设置HTML的方式:

<div id="output"></div>

ajax调用PHP代理:

// my test XML feed with only one post for now
var url = "http://www.intecllc.net/wp/feed/";
// AJAX request
var xhr = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
xhr.onreadystatechange = XHRhandler;
xhr.open("GET", "xmlproxy.php?url=" + escape(url), true);
xhr.send(null);
// handle response
function XHRhandler() {
    if (xhr.readyState == 4) {
        // parse response as JSON
        var json;
        if (JSON && JSON.parse) {
            json = JSON.parse(xhr.responseText);
        }
        else {
            eval("var json = " + xhr.responseText);
        }
        Display(json);
        xhr = null;
    }
}
// display post(s)
function Display(data) {
    var output = document.getElementById("output");
    Show("Data from URL: "+url);
    if (data && data.item) {
        if (data.item.length) {
            // multiple statuses
            for (var i=0, sl=data.item.length; i < sl; i++) {
                Show(data.item[i]);
            }
        }
        else {
            // single status
            Show(data.item);
        }
    }
    // display item
    function Show(item) {
        if (typeof item != "string") {
            item = item.title + ": " + item.description;
        }
        var p = document.createElement("p");
        p.appendChild(document.createTextNode(item));
        output.appendChild(p);
    }
}

PHP代理代码(代理将获取URL作为字符串,将其解析为XML并将其转换为JSON。JSON字符串将返回给调用JavaScript进程。):

<?php 
ini_set('display_errors', false);
set_exception_handler('ReturnError');
$r = '';
$url = (isset($_GET['url']) ? $_GET['url'] : null);
if ($url) {
    // fetch XML
    $c = curl_init();
    curl_setopt_array($c, array(
        CURLOPT_URL => $url,
        CURLOPT_HEADER => false,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_RETURNTRANSFER => true
    ));
    $r = curl_exec($c);
    curl_close($c);
}
if ($r) {
    // XML to JSON
    echo json_encode(new SimpleXMLElement($r));
}
else {
    // nothing returned?
    ReturnError();
}
// return JSON error flag
function ReturnError() {
    echo '{"error":true}';
}

很遗憾,它没有获取提要并对其进行解析。有人能帮我解决问题吗?谢谢

我认为您的输出JSON不是您所期望的。我从同一个提要中获得以下JSON

{
    "@attributes": {
        "version": "2.0"
    },
    "channel": {
        "title": "InTec, LLC",
        "link": "http://www.intecllc.net/wp",
        "description": "tagline here",
        "lastBuildDate": "Fri, 04 Mar 2016 17:47:52 +0000",
        "language": "en-US",
        "generator": "http://wordpress.org/?v=4.2.7",
        "item": {
            "title": "InTec Welcomes New Director of Contracts",
            "link": "http://www.intecllc.net/wp/intec-welcomes-new-director-of-contracts/",
            "comments": "http://www.intecllc.net/wp/intec-welcomes-new-director-of-contracts/#comments",
            "pubDate": "Fri, 04 Mar 2016 17:47:52 +0000",
            "category": {},
            "guid": "http://www.intecllc.net/wp/?p=101",
            "description": {}
        }
    }
}

在这里我们可以清楚地看到,根元素处没有立即命名为item的键,因此不能满足您的if条件if (data && data.item) {

这是一个经过修改的javascript,

    // my test XML feed with only one post for now
    var url = "http://www.intecllc.net/wp/feed/";
    // AJAX request
    var xhr = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
    xhr.onreadystatechange = XHRhandler;
    xhr.open("GET", "index.php?url=" + escape(url), true);
    xhr.send(null);
    // handle response
    function XHRhandler() {
        if (xhr.readyState == 4) {
            // parse response as JSON
            var json;
            if (JSON && JSON.parse) {
                json = JSON.parse(xhr.responseText);
            } else {
                eval("var json = " + xhr.responseText);
            }
            Display(json);
            xhr = null;
        }
    }
    // display post(s)
    function Display(data) {
        var output = document.getElementById("output");
        Show("Data from URL: " + url);
        if (data && data.channel.item) {
            if (data.channel.item.length) {
                // multiple statuses
                for (var i = 0, sl = data.channel.item.length; i < sl; i++) {
                    Show(data.channel.item[i]);
                }
            } else {
                // single status
                Show(data.channel.item);
            }
        }
        // display item
        function Show(item) {
            if (typeof item != "string") {
                item = item.title + ": " + item.description;
            }
            var p = document.createElement("p");
            p.appendChild(document.createTextNode(item));
            output.appendChild(p);
        }
    }

希望这就是你想要的

此外,您需要在yout中替换以下PHP代码

echo json_encode(new SimpleXMLElement($r));

带有

echo json_encode(simplexml_load_string($r, 'SimpleXMLElement', LIBXML_NOCDATA));

这将更好地处理<![CDATA[节点