我正试图使用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[
节点