<!-- MEMCACHE empty -->
以上内容现在导致脚本出现问题,因为它现在位于我尝试远程访问的 XML 文件的顶部。simpleXML 不喜欢 XML 文件格式不再正确的事实。我试图逃避错误,但这似乎不是诀窍。谁能指出我如何解决这个问题的方向?
只要 XML 文件的格式不正确,SimpleXML 就不会加载它……因此,您可能需要在提供给 SimpleXML 之前对该 XML 文件执行一些字符串操作。
如果这个“MEMCACHE 空”的东西总是一样的,那么基于 str_replace 的一些非常简单的事情可能会做;否则,一些正则表达式可能会起作用;-)
所以 :
simplexml_load_string
也许它不是真的“干净”......但应该工作,快速,简单......
例如,如果您的非 XML 看起来像这样:
$xml_string = <<<XML
<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<data>
<glop>TEST</glop>
<other>GLOP</other>
</data>
XML;
你可能想用这个:
$real_xml_string = str_replace("<!-- MEMCACHE empty -->\n", '', $xml_string);
注意\n
末尾的“”:您需要删除该换行符;-)
它为您提供了一个包含以下内容的字符串:
<?xml version="1.0" ?>
<data>
<glop>TEST</glop>
<other>GLOP</other>
</data>
这是格式良好的 XML ;所以你现在可以加载它:
$xml = simplexml_load_string($real_xml_string);
var_dump($xml);
你得到你想要的:
object(SimpleXMLElement)[1]
public 'glop' => string 'TEST' (length=4)
public 'other' => string 'GLOP' (length=4)
如果 MEMCACHE 事物中的“状态”并不总是“空”,您可能会使用一些正则表达式;我想,这样的事情可能会做,而不是str_replace
调用:
$real_xml_string = preg_replace("#<!-- MEMCACHE (\w+) -->\n#", '', $xml_string);
(可能需要稍作调整,具体取决于您的需要)
当然,在您的情况下,$xml_string
不会存储在源代码中,而是通过 curl 或 之类的东西获得file_get_contents
,我想。
如果它位于文件的最顶部,例如
<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<root> ... </root>
然后我认为最好的办法是将preg_replace("/^<!-- MEMCACHE empty -->$/", "", $xml_file)
它设置为empty或null。
那是因为<?xml version="1.0" ?>
必须是文件的第一行才能使其在任何情况下都是有效的 XML,DOM、SAX、SimpleXML 或其他情况。