【问题标题】:XML or text declaration not at start of entity error - PHP and JavascriptXML 或文本声明不在实体错误的开头 - PHP 和 Javascript
【发布时间】:2013-11-13 04:42:28
【问题描述】:

嗨,我正在尝试使用 DOM 文档将 xml 数据从 php 获取到 javascript,但它一直给我:XML 或文本声明不在实体错误开始处。(在萤火虫上) 我尝试将它保存到一个真正的 xml 文件中,它会输出一个格式正确的 xml。

我猜这是因为 xml 文件顶部的空白。我尝试使用 ob_start();和 ob_end_flush();但无法正常工作 顺便说一句,我是 Ajax 新手!

JS 脚本


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;

    }

【问题讨论】:

  • 可能是编码问题。您的服务器是否以 UTF-8(或任何其他多字节编码)发送文档?如果是这样,请确保没有字节顺序标记。
  • 检查是否有xml以外的其他响应。还可以尝试在响应/回显之前将 php 中的标头 Content-type 设置为 text/xml。
  • 关于如何去除字节顺序标记的任何建议?
  • @Ayesha Amarasinghe:我的建议是不要一开始就创建它,这样你就不需要删除它。您是否确认那里有 BOM?并不是说你做的太多。可以使用 XMLRecoder 删除 BOM。

标签: javascript php html ajax xml


【解决方案1】:

正如其他人所指出的,这可能是编码问题。

检查您的代码中的 Xml 字节顺序标记。

检查文档是否返回正确的 mime 类型。

不确定您的限制,但您是否考虑过将数据序列化为 Json 格式。在浏览器中使用起来更容易。

最后考虑使用 JQuery 之类的库来处理您的 ajax 请求,这样更容易实现跨浏览器兼容性。

【讨论】:

  • 感谢您的推荐。我能够成功保存所有其他 xml 文件,但不是这个!我是新手,不知道如何检查文档是否返回正确的 mime 类型和内容...
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 2014-02-19
  • 2014-08-03
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多