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

无论如何,我的托管服务不会让我使用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]:实体'nbsp'未在实体中定义”),然后我尝试使用单纯词而没有运气(它显示相同的错误“ parser error:parser error”:entity'nbsp'nbsp'nbsp'nbsp'nbsp'由于该元素中的HTML,未定义“等等”。

$xml = new SimpleXMLElement($rawXML);

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


编辑:感谢MJV的解决方案!...我只是这样做(对于其他遇到同样麻烦的人)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);
有帮助吗?

解决方案

您可能需要介绍一个预先步骤,以添加

<![CDATA[

每个之后u003Cdescription>标签
并添加

]]>

在每个之前u003C/description>标签
具体(有关相应的PHP代码段),请参见Meder的响应)

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

以这种方式,“递减”元素的完整内容将被“逃脱”,因此在此元素中发现的任何HTML(甚至XHTML)构建体都将忽略XML解析逻辑。这将照顾您提到的问题,但也可以解决许多其他常见问题。

其他提示

您可能需要使用类似的内容来操纵源代码:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top