我有一个php脚本,其中我有以下功能:
<?php
function readXML() {
$url = $_REQUEST['schemaPath'];
$xml = simplexml_load_file($url);
$fields = $xml -> fields -> field;
GLOBAL $array;
GLOBAL $c;
$array = new stdClass;
foreach($fields as $field->attributes){
foreach($field->attributes->attributes() as $a => $b){
if($a == "name") {
$c = $b;
}
if($a == "type") {
$array -> $c = $b;
}
}
}
return json_encode($array);
}
echo readXML();
?>
我正在通过以下方式进行ajax调用:
$.ajax({
cache: false,
url: "readXML.php",
type: "POST",
dataType: 'jsonp',
jsonp: 'jsonp_callback',
data: { schemaPath: "http://localhost:8983/solr/admin/file/?file=schema.xml" },
crossDomain: true,
success:function(data) {
if (!data) {
alert("Error in processing xml file");
return null;
} else {
console.log(data);
}
},
error:function(data) {
alert("Error while reading schema file.");
$("#loadingStatus").hide();
}
});
我没有得到所需的json响应格式。我在响应中收到了警告Error while reading schema file
。我实际上希望它像key:value
一样$c:$b
模式,但它就像$c:{"0":$b}
一样。如何从php脚本返回数组,以便我可以有一个有效的json响应。
答案 0 :(得分:0)
为什么不使用常规的关联数组,而不是使用stdClass。这将以最少的更改来解决您的问题。
<?php
function readXML() {
$url = $_REQUEST['schemaPath'];
$xml = simplexml_load_file($url);
$fields = $xml -> fields -> field;
GLOBAL $array;
GLOBAL $c;
$array = array(); // changed
foreach($fields as $field->attributes){
foreach($field->attributes->attributes() as $a => $b){
if($a == "name") {
$c = $b;
}
if($a == "type") {
// cast the $c to convert the value from a SimpleXMLObject
// to a string for use within the key
$c = (string)$c;
$array[$c] = $b;
}
}
}
return json_encode($array);
}
echo readXML();
?>
答案 1 :(得分:0)
我得到了解决方案,为什么在完成ajax调用后它始终会转到错误函数。这里我在ajax调用中正在进行jsonp
但是在php脚本中没有处理相同的内容。要解决此问题并返回正确的响应,需要在php脚本中添加以下内容:
if(isset($_REQUEST['jsonp'])) {
echo $_REQUEST['jsonp'].'('.json_encode($array).')';
}else{
echo json_encode($array);
}
要将回复设为key:value
,需要将$array[$c] = $b;
更改为$array[$c] = (string)$b;
以及@EmmanuelG在回答中指出的更改。