转义simpleXML错误

时间:2009-08-13 17:28:12

标签: php xml simplexml

 <!-- MEMCACHE empty -->

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

2 个答案:

答案 0 :(得分:1)

只要XML文件格式不正确,SimpleXML就不会加载它......所以,在提供给SimpleXML之前,你可能需要对该XML文件进行一些字符串操作。

基于str_replace的东西很简单,如果这个“MEMCACHE空”的东西总是一样的话;否则,一些正则表达式可能会做到这一点; - )

所以:

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


例如,如果您的非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中的“status”并不总是“空”,你可以使用一些正则表达式;我想,可能会这样,而不是str_replace电话:

$real_xml_string = preg_replace("#&lt;!-- MEMCACHE (\w+) --&gt;\n#", '', $xml_string);

(可能需要根据您的需要进行一些调整)


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

答案 1 :(得分:0)

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

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

然后我认为最好的办法是preg_replace("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file)清空 null

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