我正在从 PHP/mysql 中的数据库中获取数据,该数据库包含无效字符,例如 &.我正在按如下方式创建 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);
}
});
您可以使用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;
}
}
您从数据库中获取的字符不是无效的。 <、>等都是完全合法的文本,可以包含在XML文档中。但是,由于它们对 XML 解析器具有特殊含义,因此需要对其进行转义。那是:
-
&
--> 和 - > -->>
- <--> <</li>
到目前为止,执行此操作的最简单方法不是像代码示例尝试的那样通过字符串串联来构建 XML。而是使用在构造文档时根据需要自动转义字符的库。 XMLWriter已经被建议了。DOM 是另一种选择。
我通过添加标头摆脱了解析错误:
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);
我将首先查看浏览器的网络流量并分析 xhr 响应正文,以查看您的浏览器在 xml 有效负载(数据)方面得到了什么。您可以使用 F12 开发人员工具在 Chrome 或 IE 中执行此操作,或者如果您想使用其他代理捕获它,请查看 Fiddler:
http://www.telerik.com/fiddler
希望这有帮助!