无效的XML格式 - 如何避免这种情况

时间:2016-01-28 15:24:54

标签: javascript php html mysql xml

我从PHP / mysql中的数据库中获取数据,该数据库包含无效字符,例如&amp ;.我正在创建XML如下:

$stmt->bind_result($foo)|| fail('An error occurred: MySQL bind_result', $db->error);

$foo=htmlspecialchars($foo, ENT_XML1, 'UTF-8');


$xmlstr = "<?xml version="1.0" encoding="UTF-8" standalone="yes">
<xml>";
while ($stmt->fetch())
{ $xmlstr.="
             <RECORD>
               <FOO>$foo</FOO>
             </RECORD>";}
  $xmlstr.="
  </xml>";

$stmt->close();

echo $xmlstr;

我正在尝试接收数据并使用javascript放入一个数组 - 但它给了我错误无效的XML格式。我收到随机记录,有时它确实有效。所以在我看来,问题在于来自数据库的角色。

JavaScript中出现错误:

var foo;
var  formData = "label="+label;  //Name value Pair

 $.ajax({
            url: './php/foo.php',
            type: 'POST',
            data : formData,
            dataType: 'xml',
            success: function(returnedXMLResponse){


                $('RECORD', returnedXMLResponse).each(function(){
                     foo = $('FOO', this).text();

                })
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) { 
                    console.log("Status: " + textStatus); console.log("Error: " + errorThrown); 
}
       });

4 个答案:

答案 0 :(得分:3)

您可以使用XMLWriter来确保正确的编码等。

<?php
$stmt = new Dummy;
$stmt->bind_result($foo);

$xml = new XMLWriter(); 
$xml->openURI('php://output'); 
$xml->setIndent(true);
$xml->startDocument(); 

$xml->startElement("xml"); 
while ( $stmt->fetch() ) {
    $xml->startElement("RECORD");
    $xml->writeElement('FOO', $foo);
    $xml->endElement(); // RECORD
}
$xml->endElement(); // xml


class Dummy {
    public function bind_result(&$var) {
        $this->var = &$var;
    }

    public function fetch() {
        static $arr = array('Barnes & Noble', 'Barnum & Bailey', "Buy'n'Large");
        if ( current($arr) ) {
            $this->var = current($arr);
            next($arr);
            return true;
        }
        return false;
    }
}

答案 1 :(得分:3)

您从数据库中获取的字符无效。 &lt;,&gt;,&amp;这是完全合法的文本,可以包含在XML文档中。但是因为它们对XML解析器有特殊意义,所以需要对它们进行转义。那就是:

  • & - &gt; &放大器;放大器;
  • &GT; - &GT; &安培; GT;
  • &LT; - &GT; &安培; LT;

到目前为止,最简单的方法是不要像代码示例尝试那样通过字符串连接来构建XML。而是使用一个库,在构造文档时根据需要自动转义字符。已经提出了XMLWriter。 DOM是另一种选择。

答案 2 :(得分:1)

我通过添加标题删除了解析错误:

header('Content-type: text/xml');
$xml = new XMLWriter('UTF-8', '1.0'); 
$xml->openURI('php://output'); 
$xml->setIndent(true);
$xml->startDocument(); 

$xml->startElement("XML"); 
while ( $stmt->fetch() ) {
    $xml->startElement("ITEM");
    $xml->writeElement('ELEMENT', $reviewdate);
    $xml->endElement(); // </ITEM>
}
$stmt->close();
$xml->endElement(); // xml

$xml->flush();

unset($xml); 

答案 3 :(得分:0)

我首先查看浏览器网络流量并分析xhr响应主体,看看你的浏览器获取的xml有效负载(数据)。您可以使用F12开发人员工具在Chrome或IE中执行此操作,或者如果您想使用其他代理捕获它,请查看Fiddler:

http://www.telerik.com/fiddler

希望这有帮助!