Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-SimpleXML解析错误_Php_Xml_Simplexml - Fatal编程技术网

PHP-SimpleXML解析错误

PHP-SimpleXML解析错误,php,xml,simplexml,Php,Xml,Simplexml,请参见底部的编辑以显示更准确的错误输出 我第一次使用SimpleXML用PHP解析一些大的(~15MB)XML文件。这些文件是航班搜索结果,因此具有较长的属性(返回Kayak的链接;示例: “/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&sid=26-Vu01v7ilzhSAjPVLZ3Ul” SimpleXML在分析时抛出此错误: 实体:第10行:解析器

请参见底部的编辑以显示更准确的错误输出

我第一次使用SimpleXML用PHP解析一些大的(~15MB)XML文件。这些文件是航班搜索结果,因此具有较长的属性(返回Kayak的链接;示例:
“/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&sid=26-Vu01v7ilzhSAjPVLZ3Ul”

SimpleXML在分析时抛出此错误:

实体:第10行:解析器错误:EntityRef:应为“;”in“,然后

“38917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052和sid in” 然后,

simplexml加载字符串()[函数.simplexml加载字符串]:^in

对于有这些URL的每一行,依此类推

我发现有人提到SimpleXML不喜欢php.net上没有解决方案的长属性。我宁愿现在就使用和学习SimpleXML,如果有一个非janky的、稍微简单的解决方法,就克服这个错误

有人有解决办法吗?提前谢谢

我尝试输入XML的前13行,但它只输出信息而不输出XML,所以……如果有帮助,我可以这样做。我不确定使用另一个解析器/扩展是否会降低功能或易用性,但如果没有解决方法,请随意提出另一个建议(我想可能是DOM或XMLReader)

编辑以下内容以包含较少掺杂的错误输出:

错误1:

simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: Entity: line 10: parser error : EntityRef: expecting ';' in 
simplexml_load_string()[]:实体:第10行:解析器错误:EntityRef:中应为“;”
错误2:(我认为XML很好,因为它与使用DOM的Python脚本一起工作;我将它转换为PHP,因为我不懂Python)。我不知道浏览器中的输出会有所不同。感谢耐心等待。)

]:38917408.Pt8rW8.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&_锡丁
错误3:

function.simplexml-load-string</a>]:                                                                                ^ in     
function.simplexml加载字符串]:^in

(所有这些空格都在那里)

Darryl在上面的评论中正确地回答了为什么会发生这种情况。解决此问题的一种方法是使用str_replace()将所有的“&”符号替换为“&;”在XML中。根据,您还可以使用此正则表达式将符号替换为其实体:

$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", 

正如在其他回答和评论中提到的,您的源XML已损坏,XML解析器应该拒绝无效的输入。libxml有一个“recover”模式,可以让您加载这个损坏的XML,但是您会丢失“&sid”部分,因此它不会有帮助

如果你很幸运并且喜欢冒险,你可以尝试通过修正输入来让它工作。您可以使用一些字符串替换来转义看起来像在URL查询部分的符号

$xml = file_get_contents('broken.xml');
// replace '&' followed by a bunch of letters, numbers
// and underscores and an equal sign with &amp;
$xml = preg_replace('#&(?=[a-z_0-9]+=)#', '&amp;', $xml);
$sxe = simplexml_load_string($xml);

当然,这只是一种黑客行为,解决这种情况的唯一好办法是让XML提供商修复它们的生成器。因为如果它生成的XML被破坏了,谁知道还有哪些错误没有被注意到呢?

可能解析的XML文件对于解析器来说太大了。但是您可以尝试将LIBXML_parsehug作为一个选项传递,这对我的情况很有帮助。

我遇到了13MB文件的问题,并通过包含
LIBXML_parsehug
参数解决了这个问题:

$xml = new SimpleXMLElement($contents, LIBXML_PARSEHUGE);
注意:在1GB下使用
ini\u set
并不能解决我的问题,因为解析的内容占用的空间比这个还多


一种更激进的方法是使用其他库来流式传输而不是加载整个文件(SAX解析器与DOM解析器),比如

它不是“long”属性,而是属性中的“
&
”。它不是一个正确的xml实体。所有文字符号都需要编码(讽刺的是)为
&-错误表明它应为“;”因为它希望'
&sid
'成为一个实体,即:'
&sid”。解决方案是让生成该XML的人修复其代码并输出一些有效的XML plzkthx。在实际文件中,它表示:“&_sid=15-错误是由我的浏览器输出的。很明显,我对编码一无所知。最后的评论几乎使所有发布的内容无效。请永远不要在浏览器中查看XML内容。发布指向XML文件的链接以及错误消息的完整示例。如果是从浏览器中获取的,请使用“查看源代码”以避免您刚才描述的内容。我编辑了OP以包含更好的信息。再次感谢您的帮助和耐心!如何检查解析后的XML输入是否无效?如果XML无效,SimpleXmlElement()函数不会返回false?是吗?如果XML是无效的,那么你就真的被搞砸了。您可以尝试使用字符串操作(与XML操作相反)来修复数据,但解决这种情况的唯一可靠方法是生成有效的XML。
$xml = new SimpleXMLElement($contents, LIBXML_PARSEHUGE);