【问题标题】:XML to JSON proxy server not fetching XML feedXML 到 JSON 代理服务器未获取 XML 提要
【发布时间】:2025-12-07 19:15:01
【问题描述】:

我正在尝试使用 wordpress 提供的 RSS 源将 wordpress 博客中的帖子显示到远程网站上。但是,当然,我不得不处理试图绕过 CORS 的问题。因此,我现在尝试在 PHP 中创建一个 XML 到 JSON 代理服务器,并使用this resource as a guide

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

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

调用PHP代理的ajax:

// 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}';
}

不幸的是,它没有抓取提要并对其进行解析。有人可以帮我解决问题吗?谢谢。

【问题讨论】:

  • 我会先尝试一个处理 XHR 请求的库(jQuery 就可以了)。 XHR 在不同浏览器中的实现方式非常不同。
  • 在`$r = curl_exec($c);`之后尝试var_dump($r);
  • 我以为 JavaScript 默认不解析 json。我在这里错了吗?在你的Display(data) 的开头做一个console.log(data)。开发者控制台的输出是什么?
  • 你的ajax调用的结果是什么?

标签: javascript php json proxy


【解决方案1】:

我认为您的输出 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 &amp;&amp; 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);
        }
    }

希望这就是你要找的东西

另外,您需要在 PHP 代码中替换以下内容

echo json_encode(new SimpleXMLElement($r));

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

这将更好地处理&lt;![CDATA[ 节点

【讨论】:

  • 谢谢。我会检查并报告!
  • 我正在使用 Chrome,在我的 devconsole 中我看到我的 Get 请求是这样的:GET "mydomainhere.com/xmlproxy.php?url=https%3A//…"。然后在控制台的下一行说: Uncaught TypeError: Cannaot read property 'item' of undefined.
  • 你能验证你的 php 脚本输出和我上面提到的一样吗? (第一个代码块)
  • 已验证 php 脚本输出与提到的相同。执行 console.log(data) 时,我进入控制台:Object{error: true}.
  • 如果您的 php 脚本输出的数据与我提到的相同,那么您应该在 console.log(data) 中获得相同的数据,因为它们本质上是相同的。在Display(json); 之前尝试console.log(json)