3

我一直在尝试解析这个提要。如果您单击该链接,您会注意到它甚至无法在浏览器中正确解析它。

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

$xml = new SimpleXMLElement($rawXML);

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


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

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

2 回答 2

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

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

于 2009-10-05T03:26:12.463 回答
4

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

<![CDATA[

在每个 <description> 标签之后
添加

]]>

在每个 </description> 标记之前
具体来说,(请参阅 meder 对相应 PHP 片段的响应)

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

以这种方式,“description”元素的完整内容将被“转义”,因此在该元素中发现的任何可能引发 XML 解析逻辑的 html(甚至 xhtml)构造都将被忽略。这将照顾   您提到的问题还有许多其他常见问题。

于 2009-10-05T03:34:27.330 回答