【发布时间】:2009-08-13 17:28:12
【问题描述】:
<!-- MEMCACHE empty -->
以上内容现在导致脚本出现问题,因为它现在放置在我尝试远程访问的 XML 文件的顶部。 simpleXML 不喜欢 XML 文件格式不再正确的事实。我试图逃避错误,但这似乎不是诀窍。任何人都可以指出如何解决这个问题的方向吗?
【问题讨论】:
<!-- 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("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file) 设置为empty 或null。
这是因为<?xml version="1.0" ?> 必须是文件的第一行,才能在任何情况下成为有效的 XML,DOM、SAX、SimpleXML 或其他。
【讨论】: