我使用SimpleXML首次使用PHP解析一些大的(~15MB)XML文件.这些文件是航班搜索结果,所以它们有很长的属性(链接回Kayak;例如:
“/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052\u0026amp;sid=26-Vu01v7ilzhSAjPVLZ3Ul”
解析时,SimpleXML会抛出此错误:
“实体:第10行:解析器错误:EntityRef:期待’;’在“然后;
“38917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052& sid in”
然后;
“simplexml_load_string()[function.simplexml-load-string]:^ in,”
等等这些网址的每一行都是如此.
我发现SimpleXML并不喜欢PHP.net上的长属性而没有解决方案.我宁愿现在只使用和学习SimpleXML,如果有一个非常简洁,有点简单的解决方法,可以解决这个错误.
有没有人有办法解决吗?提前致谢!
我尝试输入XML的前13行,但它只输出没有XML的信息….所以如果它有帮助我可以这样做.我不确定使用另一个解析器/扩展是否会降低功能或易用性,但如果没有解决方法,请随意建议另一个(DOM或XMLReader是我正在考虑的).
http://dl.dropbox.com/u/10206237/stack_overflow_xml.xml
错误1:
simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: Entity: line 10: parser error : EntityRef: expecting ';' in
错误2 :(我认为XML很好,因为它适用于使用DOM的Python脚本;我正在将它转换为PHP,因为我不知道Python).我不知道浏览器中的输出会有所不同.谢谢你耐心等待.)
<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: 38917408.Pt8rW8.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&_sid_ in
错误3:
function.simplexml-load-string</a>]: ^ in
(所有这些空间都在那里)
如果你很幸运,并且你喜欢冒险,你可以尝试以某种方式通过修复输入来使其工作.您可以使用一些字符串替换来转义看起来像是在URL的查询部分中的&符号.
$xml = file_get_contents('broken.xml'); // replace '&' followed by a bunch of letters,numbers // and underscores and an equal sign with & $xml = preg_replace('#&(?=[a-z_0-9]+=)#','&',$xml); $sxe = simplexml_load_string($xml);
当然,这只是一个黑客攻击,修复你的情况的唯一好方法是让你的XML提供者修复他们的生成器.因为如果它生成了破碎的XML,谁知道其他错误会被忽视?