PHP的XML解析错误
我有一些php代码,它调用我在不同服务器/实例上的api并响应响应。每当我尝试在浏览器中运行下面的php时,我都会收到一个xml解析错误,在文档的末尾声明PHP的XML解析错误,php,xml,apache,api,Php,Xml,Apache,Api,我有一些php代码,它调用我在不同服务器/实例上的api并响应响应。每当我尝试在浏览器中运行下面的php时,我都会收到一个xml解析错误,在文档的末尾声明额外的内容。我无法找出我的代码中的错误在哪里,任何指针都将不胜感激 PHP: API PHP <?php error_reporting(E_ALL ^ E_NOTICE); // The following four statements allow AJAX style Javascript requests to get t
额外的内容。我无法找出我的代码中的错误在哪里,任何指针都将不胜感激
PHP:
API PHP
<?php
error_reporting(E_ALL ^ E_NOTICE);
// The following four statements allow AJAX style Javascript requests to get through by allowing certain headers
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST');
header('Access-Control-Max-Age: 604800');
header('Access-Control-Allow-Headers: X-Requested-With,Content-Type, Content-Length, Authorization, Connection');
$valid_user = 'someuser';
//db host
define(DB_HOST,'192.168.1.116');
define(DB_USER,'DBUSER');
define(DB_PASSWORD,'DBPASS');
define(DB_DATABASE,'databasename');
$dbConn=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);
$query="select signature from api_keys where id='$valid_user'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
if($cnt!=1)
invalidRequest('001');
$row=mysqli_fetch_assoc($result);
$signature = $row["signature"];
$headers=apache_request_headers();
$digest=$headers["Authorization"];
if (is_null($digest))
{
invalidRequest('002');
}
// Attempt to auth the request - grab the token and request date provided by the external API caller
$token=$_POST["token"];
$request_date=$_POST["timestamp"];
// No token or reqauest generates an error
if(!$token || !$request_date)
{
invalidRequest('002');
}
// The page wasn't called right, so throw an error
if(!$_GET["action"])
{
invalidRequest('002');
}
$hash_string=base64_encode(hash_hmac('sha256',$valid_user . ":" . $token . ":" . $request_date,$signature,1));
//echo $hash_string . ":" . $digest;
//exit();
// Compare the hash we generated with the one provided by the requester
// If they do not match, throw an error
if($hash_string!=$digest)
{
invalidRequest('002');
}
$query="select token from api_tokens where id='$valid_user' and token='$token'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
('$valid_user','$token','" . date("Y-m-d H:i:s") . "')";
// Get the information requested and return it as XML string.
if($_GET["action"]=='getAllAlbums')
{
// This is a request for all the albums in the DB
$query="select id,artist,name from albums order by id";
$result=mysqli_query($dbConn,$query);
if(mysqli_num_rows($result) < 1)
invalidRequest('006');
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_string.="<music_inventory>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<album id=\"" . $row["id"] . "\">\n";
$xml_string.="<artist>" . htmlentities($row["artist"]) . "</artist>\n";
$xml_string.="<name>" . htmlentities($row["name"]) . "</name>\n";
$xml_string.="</album>\n";
}
$xml_string.="</music_inventory>";
}
else if($_GET["action"]=='getAlbum')
{
// This was a request for a single album's full info
$query="select id,type,albumart,artist,name,year,label,disc,totaldiscs from albums where id='" . $_POST["albumID"] . "'";
$result=mysqli_query($dbConn,$query);
if(mysqli_num_rows($result) < 1)
invalidRequest('006');
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_string.="<music_inventory>\n";
while($row=mysqli_fetch_assoc($result))
{
if($row["type"]=='F')
$type='full length';
else if($row["type"]=='E')
$type='EP';
else
$type='unknown';
$xml_string.="<album id=\"" . $row["id"] . "\" type=\"$type\" albumart=\"" . $row["albumart"] . "\">\n";
$xml_string.="<artist>" . $row["artist"] . "</artist>\n";
$xml_string.="<name>" . $row["name"] . "</name>\n";
$xml_string.="<year>" . $row["year"] . "</year>\n";
$xml_string.="<label>" . $row["label"] . "</label>\n";
$xml_string.="<disc>" . $row["disc"] . "</disc>\n";
$xml_string.="<totaldiscs>" . $row["totaldiscs"] . "</totaldiscs>\n";
}
$query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
$result=mysqli_query($dbConn,$query);
$xml_string.=" <tracklist>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<track id=\"" . $row["track_number"] . "\">" . htmlentities($row["track_title"]) . "</track>\n";
}
$xml_string.="</tracklist>\n";
$xml_string.="</album>\n";
$xml_string.="</music_inventory>\n";
}
else if($_GET["action"]=='getTrackList')
{
// This was a request for a specific album's track list
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
$result=mysqli_query($dbConn,$query);
$xml_string.="<music_inventory>";
$xml_string.="<album id=\"" . $_POST["albumID"] . "\"></album>\n";
$xml_string.="<tracklist>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<track id=\"" . $row["track_number"] . "\">" . $row["track_title"] . "</track>\n";
}
$xml_string.="</tracklist>\n";
$xml_string.="</music_inventory>";
}
else
{
// This did not have a valid request attached to it
invalidRequest('003');
}
// Echo out the result as XML
header('Content-Type: text/xml');
echo $xml_string;
exit();
function invalidRequest($error)
{
// This is the error thrown in all cases above.
$xml_string="<?xml version=\"1.0\"?>\n";
$xml_string.="<systemerror>\n";
$xml_string.=" <errorcode>$error</errorcode>\n";
$xml_string.="</systemerror>\n";
header('Content-Type: text/xml');
echo $xml_string;
exit();
}
?>
该错误消息表示您输出的XML字符串无效。您发布的PHP代码(可能)没有问题。查看源代码并确保每个元素都正确关闭和嵌套。API可能正在向您发送错误数据。如果API响应总是有相同的错误,您可以通过在将其传递到浏览器之前执行字符串操作(例如str_replace或preg_replace)或simplexml_decode_string()
手动创建XML(字符串连接)来修复。这是一个容易出错的过程。这也是一个由经验不足的程序员完成的过程。两者的结合或多或少会导致错误情况,如您所描述的(“文档末尾的额外内容”)。请先联系我们网站上关于此错误的现有问答材料。在您的情况下,可能有许多具体的原因导致错误,但问答的目的是描述错误信息并提供一般解决方案。
<?php
error_reporting(E_ALL ^ E_NOTICE);
// The following four statements allow AJAX style Javascript requests to get through by allowing certain headers
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST');
header('Access-Control-Max-Age: 604800');
header('Access-Control-Allow-Headers: X-Requested-With,Content-Type, Content-Length, Authorization, Connection');
$valid_user = 'someuser';
//db host
define(DB_HOST,'192.168.1.116');
define(DB_USER,'DBUSER');
define(DB_PASSWORD,'DBPASS');
define(DB_DATABASE,'databasename');
$dbConn=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);
$query="select signature from api_keys where id='$valid_user'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
if($cnt!=1)
invalidRequest('001');
$row=mysqli_fetch_assoc($result);
$signature = $row["signature"];
$headers=apache_request_headers();
$digest=$headers["Authorization"];
if (is_null($digest))
{
invalidRequest('002');
}
// Attempt to auth the request - grab the token and request date provided by the external API caller
$token=$_POST["token"];
$request_date=$_POST["timestamp"];
// No token or reqauest generates an error
if(!$token || !$request_date)
{
invalidRequest('002');
}
// The page wasn't called right, so throw an error
if(!$_GET["action"])
{
invalidRequest('002');
}
$hash_string=base64_encode(hash_hmac('sha256',$valid_user . ":" . $token . ":" . $request_date,$signature,1));
//echo $hash_string . ":" . $digest;
//exit();
// Compare the hash we generated with the one provided by the requester
// If they do not match, throw an error
if($hash_string!=$digest)
{
invalidRequest('002');
}
$query="select token from api_tokens where id='$valid_user' and token='$token'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
('$valid_user','$token','" . date("Y-m-d H:i:s") . "')";
// Get the information requested and return it as XML string.
if($_GET["action"]=='getAllAlbums')
{
// This is a request for all the albums in the DB
$query="select id,artist,name from albums order by id";
$result=mysqli_query($dbConn,$query);
if(mysqli_num_rows($result) < 1)
invalidRequest('006');
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_string.="<music_inventory>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<album id=\"" . $row["id"] . "\">\n";
$xml_string.="<artist>" . htmlentities($row["artist"]) . "</artist>\n";
$xml_string.="<name>" . htmlentities($row["name"]) . "</name>\n";
$xml_string.="</album>\n";
}
$xml_string.="</music_inventory>";
}
else if($_GET["action"]=='getAlbum')
{
// This was a request for a single album's full info
$query="select id,type,albumart,artist,name,year,label,disc,totaldiscs from albums where id='" . $_POST["albumID"] . "'";
$result=mysqli_query($dbConn,$query);
if(mysqli_num_rows($result) < 1)
invalidRequest('006');
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml_string.="<music_inventory>\n";
while($row=mysqli_fetch_assoc($result))
{
if($row["type"]=='F')
$type='full length';
else if($row["type"]=='E')
$type='EP';
else
$type='unknown';
$xml_string.="<album id=\"" . $row["id"] . "\" type=\"$type\" albumart=\"" . $row["albumart"] . "\">\n";
$xml_string.="<artist>" . $row["artist"] . "</artist>\n";
$xml_string.="<name>" . $row["name"] . "</name>\n";
$xml_string.="<year>" . $row["year"] . "</year>\n";
$xml_string.="<label>" . $row["label"] . "</label>\n";
$xml_string.="<disc>" . $row["disc"] . "</disc>\n";
$xml_string.="<totaldiscs>" . $row["totaldiscs"] . "</totaldiscs>\n";
}
$query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
$result=mysqli_query($dbConn,$query);
$xml_string.=" <tracklist>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<track id=\"" . $row["track_number"] . "\">" . htmlentities($row["track_title"]) . "</track>\n";
}
$xml_string.="</tracklist>\n";
$xml_string.="</album>\n";
$xml_string.="</music_inventory>\n";
}
else if($_GET["action"]=='getTrackList')
{
// This was a request for a specific album's track list
$xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
$result=mysqli_query($dbConn,$query);
$xml_string.="<music_inventory>";
$xml_string.="<album id=\"" . $_POST["albumID"] . "\"></album>\n";
$xml_string.="<tracklist>\n";
while($row=mysqli_fetch_assoc($result))
{
$xml_string.="<track id=\"" . $row["track_number"] . "\">" . $row["track_title"] . "</track>\n";
}
$xml_string.="</tracklist>\n";
$xml_string.="</music_inventory>";
}
else
{
// This did not have a valid request attached to it
invalidRequest('003');
}
// Echo out the result as XML
header('Content-Type: text/xml');
echo $xml_string;
exit();
function invalidRequest($error)
{
// This is the error thrown in all cases above.
$xml_string="<?xml version=\"1.0\"?>\n";
$xml_string.="<systemerror>\n";
$xml_string.=" <errorcode>$error</errorcode>\n";
$xml_string.="</systemerror>\n";
header('Content-Type: text/xml');
echo $xml_string;
exit();
}
?>