无法解析格式不佳的XML

时间:2009-10-05 03:19:58

标签: php xml simplexml xml-parsing

我一直在尝试解析this feed。如果单击该链接,您会发现它甚至无法在浏览器中正确解析它。

无论如何,我的托管服务不会让我使用simplexml_load_file,所以我一直在使用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”中定义,然后我尝试使用SimpleXMLElement没有运气(它显示相同的错误“解析器错误:实体'nbsp'未定义“等等......因为该元素中的HTML。)

$xml = new SimpleXMLElement($rawXML);

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


编辑:感谢mjv的解决方案!...我刚刚做了这个(对于其他有同样问题的人)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);

2 个答案:

答案 0 :(得分:5)

您可能需要使用以下内容来操作源代码:

$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);

您需要为包含字符数据的每个元素执行此操作。

答案 1 :(得分:4)

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

<![CDATA[

在每个&lt; description&gt;之后标签
并添加

]]>
每个&lt; / description&gt;之前的

标签
具体来说,(参见meder对相应PHP代码段的回复)

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

以这种方式,'decription'元素的完整内容将被“转义”,因此在此元素中找到并且易于抛出XML解析逻辑的任何html(或甚至xhtml)构造都将被忽略。这将照顾&amp; nbsp;你提到的问题,还有许多其他常见问题。