之前接触的项目大多是json数据居多,最近的项目需要使用php获取xml,解析后入库,谁知道就这么个简单的问题踩了很多坑,记录一下。
根据帮助文档查询,php可以使用simplexml_load_file() 函数把 XML 文档载入对象中。使用函数获取到post过来的xml数据调用simplexml_load_file()方法,直接报错:
String not started expecting ' or "
经过检查和查资料,应该是转义符反斜线 \ 和单双引号导致的问题,这里用到了php的函数stripslashes(),可以去除反斜线。再执行程序,继续报错:
EntityRef: expecting ';'
经过检查和查资料,确定是 & 导致了错误,& 属于不合法的XML字符。
以下5个是常见的不合法XML字符和对应的XML文档预定义好的实体:
小于号 < 需要转化为:<
大于号 > 需要转化为:>
和且与 & 需要转化为:&
单引号 ' 需要转化为:'
双引号 " 需要转化为:"
这里使用了str_replace()进行了替换,终于出现了想要的结果。
public function getxml(){
//示例xml文本
$xmlStr = "<?xml version=\"1.0\"?>\n<msg>\n\t<appmsg appid=\"\" sdkver=\"0\">\n\t\t<title>标题<\/title>\n\t\t<des>简介<\/des>\n\t\t<url>http:\/\/abc.com\/def?g=1&h=2<\/url>\n\t\t<\/appmsg>\n\t<\/msg>";
$xmlStr = str_replace('&', '&', $xmlStr);
$xmlStr = stripslashes($xmlStr);
$xml_resp = simplexml_load_string($xmlStr);
$xml_ary = json_decode(json_encode($xml_resp), true);
}