我从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);
}
});
答案 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; &放大器;放大器; 到目前为止,最简单的方法是不要像代码示例尝试那样通过字符串连接来构建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
希望这有帮助!