0
 <!-- MEMCACHE empty -->

以上内容现在导致脚本出现问题,因为它现在位于我尝试远程访问的 XML 文件的顶部。simpleXML 不喜欢 XML 文件格式不再正确的事实。我试图逃避错误,但这似乎不是诀窍。谁能指出我如何解决这个问题的方向?

4

2 回答 2

1

只要 XML 文件的格式不正确,SimpleXML 就不会加载它……因此,您可能需要在提供给 SimpleXML 之前对该 XML 文件执行一些字符串操作。

如果这个“MEMCACHE 空”的东西总是一样的,那么基于 str_replace 的一些非常简单的事情可能会做;否则,一些正则表达式可能会起作用;-)

所以 :

也许它不是真的“干净”......但应该工作,快速,简单......


例如,如果您的非 XML 看起来像这样:

$xml_string = <<<XML
&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>
XML;

你可能想用这个:

$real_xml_string = str_replace("&lt;!-- MEMCACHE empty --&gt;\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("#&lt;!-- MEMCACHE (\w+) --&gt;\n#", '', $xml_string);

(可能需要稍作调整,具体取决于您的需要)


当然,在您的情况下,$xml_string不会存储在源代码中,而是通过 curl 或 之类的东西获得file_get_contents,我想。

于 2009-08-13T17:32:46.227 回答
0

如果它位于文件的最顶部,例如

&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<root> ... </root>

然后我认为最好的办法是将preg_replace("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file)它设置为emptynull

那是因为<?xml version="1.0" ?>必须是文件的第一行才能使其在任何情况下都是有效的 XML,DOM、SAX、SimpleXML 或其他情况。

于 2009-08-13T17:31:45.560 回答