代码之家  ›  专栏  ›  技术社区  ›  Mottie

无法分析格式不正确的XML

  •  3
  • Mottie  · 技术社区  · 15 年前

    我一直在试着分析 this feed . 如果你点击这个链接,你会发现它甚至不能在浏览器中正确解析。

    无论如何,我的宿主服务不允许我使用simpleXML加载文件,所以我一直使用curl获取它,然后将字符串加载到dom中,如下所示:

    $dom = new DOMDocument;
    $dom->loadXML($rawXML);
    if (!$dom) {
     echo 'Error while parsing the document';
     exit;
    }
    $xml = simplexml_import_dom($dom);
    

    但是我得到了错误(“domDocument::loadXML()[domDocument.loadXML]:entity'nbsp'未在entity中定义),然后我尝试使用simpleXML元素,但没有运气(它显示相同的错误“parser error:entity'nbsp'未定义”等)。因为那个元素中的HTML)。

    $xml = new SimpleXMLElement($rawXML);
    

    所以我的问题是,如何跳过/忽略/删除该元素,以便分析其余的数据?


    编辑:感谢MJV的解决方案!…我只是做了这个(为其他有同样麻烦的人)

    $rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
    $rawXML = str_replace('</description>',']]></description>',$rawXML);
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   mjv    15 年前

    您可能需要引入一个预分析步骤,该步骤将添加

    <![CDATA[
    

    在每个<说明>标签之后
    并添加

    ]]>
    

    在每个标签前
    具体来说,(有关相应的PHP代码段,请参见Meder的响应)

    <description>blah <br />&nbsp; blah, blah...</description>
    should become
    <description><![CDATA[blah <br />&nbsp; blah, blah...]]></description>
    

    以这种方式,“deccription”元素的完整内容将被“转义”,因此在此元素中找到的任何HTML(甚至XHTML)构造都将被忽略,并且容易引发XML分析逻辑。这将解决您提到的问题,以及许多其他常见问题。

        2
  •  5
  •   meder omuraliev    15 年前

    您可能需要操作源代码,比如:

    $xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
    if ( $xml ) {
        $xml = preg_replace( '/&nbsp/', '&amp;nbsp', $xml );
        $xml = new SimpleXMLElement($xml);
        var_dump($xml);
    }
    

    在将它提供给XML解析器afaik之前,我想推荐其他方法,但我认为这是唯一的方法。

    编辑:我想你可以代替 <description> 具有 <description><![CDATA[ 等等:

    <?php
    $xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
    $xml = preg_replace( '/<description>/', '<description><![CDATA[', $xml );
    $xml = preg_replace( '/<\/description>/', ']]></description>', $xml );
    $xml = new SimpleXMLElement($xml);
    var_dump($xml);
    

    对于包含字符数据的每个元素,都需要这样做。