【问题标题】:escape simpleXML errors转义 simpleXML 错误
【发布时间】:2009-08-13 17:28:12
【问题描述】:
 <!-- MEMCACHE empty -->

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

【问题讨论】:

    标签: php xml simplexml


    【解决方案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 之类的东西获得,我想。

    【讨论】:

    • 意在尽快回复。完美运行,谢谢!在我进行更改后,他们禁用了 memcache。去图吧。
    • 不客气 :-) ;;运气不好,关于在问题解决后禁用 memcached :-D
    【解决方案2】:

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

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

    那么我认为最好的做法是将preg_replace("/^&amp;lt;!-- MEMCACHE empty --&amp;gt;$/", "", $xml_file) 设置为emptynull

    这是因为&lt;?xml version="1.0" ?&gt; 必须是文件的第一行,才能在任何情况下成为有效的 XML,DOM、SAX、SimpleXML 或其他。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2018-08-17
      相关资源
      最近更新 更多