XML或文本声明不在实体错误的开头-PHP和Javascript
您好,我正在尝试使用DOM文档从php获取xml数据到javascript,它不断地给我:xml或文本声明不在实体错误的开头(关于firebug) 我尝试将它保存到一个真正的xml文件中,它输出一个格式良好的xml 我想这是因为xml文件顶部有空白。我尝试使用ob_start();和ob_end_flush();但是没法让它工作 顺便说一句,我是阿贾克斯新手 JS脚本XML或文本声明不在实体错误的开头-PHP和Javascript,javascript,php,html,ajax,xml,Javascript,Php,Html,Ajax,Xml,您好,我正在尝试使用DOM文档从php获取xml数据到javascript,它不断地给我:xml或文本声明不在实体错误的开头(关于firebug) 我尝试将它保存到一个真正的xml文件中,它输出一个格式良好的xml 我想这是因为xml文件顶部有空白。我尝试使用ob_start();和ob_end_flush();但是没法让它工作 顺便说一句,我是阿贾克斯新手 JS脚本 var xh=createRequest(); var xhrObject=false; if(window.XMLHttpR
var xh=createRequest();
var xhrObject=false;
if(window.XMLHttpRequest)
{
xHRObject=newXMLHttpRequest();
}
else if(window.ActiveXObject)
{
xHRObject=newActiveXObject(“Microsoft.XMLHTTP”);
}
函数getData()
{
如果((xh.readyState==4)和&(xh.status==200))
{
警报(“hi”);
var serverResponse=xh.responseXML;
var header=serverResponse.getElementsByTagName(“好”);
var spantag=document.getElementById(“sp”);
var x;
spantag.innerHTML=“”;
x=“”;
x+=“IDpricequantityTotalRemove”;
对于(i=0;icreateElement(“货物”);
$goods=$doc->appendChild($goods);
foreach($Item=>$ItemName的商店商品)
{
$good=$doc->createElement('good');
$good=$goods->appendChild($good);
$title=$doc->createElement('ID');
$title=$good->appendChild($title);
$value=$doc->createTextNode($Item);
$value=$title->appendChild($value);
$price=$doc->createElement('price');
$price=$good->appendChild($price);
$value3=$doc->createTextNode($ItemName[“price”]);
$value3=$price->appendChild($value3);
$quantity=$doc->createElement('quantity');
$quantity=$good->appendChild($quantity);
$value2=$doc->createTextNode($ItemName[“qty”]);
$value2=$quantity->appendChild($value2);
$total=$doc->createElement('total');
$total=$good->appendChild($total);
$value3=$doc->createTextNode($ItemName[“total”]);
$value3=$total->appendChild($value3);
}
$strXml=$doc->saveXML();
//回声(
----数据记录!!!----);
返回$strXml;
}
正如其他人所指出的,这可能是一个编码问题
检查代码中的Xml字节顺序标记
检查文档是否返回正确的mime类型
不确定您的限制,但您是否考虑过将数据序列化为Json格式。在浏览器中使用它更容易
最后考虑使用像jQuery这样的库来处理Ajax请求,更容易跨浏览器兼容。
可能是一个编码问题。您的服务器是否在UTF-8(或任何其他多字节编码)中发送文档??如果是,请确保没有字节顺序标记。检查是否有xml以外的响应。还可以尝试在响应/echo之前将php中的标题内容类型设置为text/xml。有关于如何删除字节顺序标记的建议吗?@Ayesha Amarasinghe:我的建议是,首先不要创建它,这样就不需要删除它。您验证了吗你有一个BOM表吗?并不是说你做得太多。BOM表可以用删除。谢谢你的建议。我可以成功保存所有其他xml文件,但这次不行!我是新手,不知道如何检查文档是否返回正确的mime类型和内容。。。var xh = createRequest();
var xhrObject = false;
if (window.XMLHttpRequest)
{
xHRObject = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xHRObject = new ActiveXObject("Microsoft.XMLHTTP");
}
function getData()
{
if ((xh.readyState == 4) &&(xh.status == 200))
{
alert("hi");
var serverResponse = xh.responseXML;
var header = serverResponse.getElementsByTagName("good");
var spantag = document.getElementById("sp");
var x;
spantag.innerHTML = "";
x = "<table cellpadding='1' cellspacing='6' border='0'>";
x += "<tr><td>ID</td><td>price</td><td>quantity</td><td>Total</td><td>Remove</td></tr>";
for (i=0; i<header.length; i++)
{
var id = header[i].getElementsByTagName("ID")[0].childNodes[0].nodeValue;
var price = header[i].getElementsByTagName("price")[0].childNodes[0].nodeValue;
var qty = header[i].getElementsByTagName("quantity")[0].childNodes[0].nodeValue;
var total = header[i].getElementsByTagName("total")[0].childNodes[0].nodeValue;
if(qty=="0")
{
continue;
}
x += "<tr>"
+ "<td>" + id + "</td>"
+ "<td>" + price + "</td>"
+ "<td>" + qty + "</td>"
+ "<td>" + total + "</td>"
+ "<td>" + "<a href='#' onclick='AddRemoveItem(\"Remove\","+id+");'>Remove Item</a>" + "</td>"
+ "</tr>";
}
x += "</table>";
if (header.length != 0)
spantag.innerHTML = x;
}
}
PHP code
function toXml($shop_goods)
{
$doc = new DomDocument();
$goods = $doc->createElement('goods');
$goods = $doc->appendChild($goods);
foreach ($shop_goods as $Item => $ItemName)
{
$good = $doc->createElement('good');
$good = $goods->appendChild($good);
$title = $doc->createElement('ID');
$title = $good->appendChild($title);
$value = $doc->createTextNode($Item);
$value = $title->appendChild($value);
$price = $doc->createElement('price');
$price = $good->appendChild($price);
$value3 = $doc->createTextNode($ItemName["price"]);
$value3 = $price->appendChild($value3);
$quantity = $doc->createElement('quantity');
$quantity = $good->appendChild($quantity);
$value2 = $doc->createTextNode($ItemName["qty"]);
$value2 = $quantity->appendChild($value2);
$total = $doc->createElement('total');
$total = $good->appendChild($total);
$value3 = $doc->createTextNode($ItemName["total"]);
$value3 = $total->appendChild($value3);
}
$strXml = $doc->saveXML();
//echo("<br>----- DATA RECOREDED!!! ----");
return $strXml;
}