1

我想解析一个外部 php 提要。地址:http ://www.hittadjur.se/feed.php?count=1

输出:

<?xml version="1.0"?>
<annons>
<rubrik>Wilja</rubrik>
<datum>2013-03-22</datum>
<ras>Chihuahua långhår</ras>
<ort>Göteborg</ort><bildurl>http://www.hittadjur.se/images/uploaded/thumbs/1363984467.jpg</bildurl><addurl>http://www.hittadjur.se/index.php?page=case&type=&county=32&subpage=show&case=1363984558</addurl>
</annons>

我的 PHP 代码不起作用:

$content = utf8_encode(file_get_contents('http://www.hittadjur.se/feed.php?count=1'));
$xml = simplexml_load_file($content);
echo $xml->annons->rubrik;

我使用的原因utf8_encode是,如果我不这样做,我会收到此消息:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xE5 0x6E 0x67 0x68

现在的错误是:

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity 有任何想法吗?谢谢!

4

3 回答 3

0

恐怕提要提供格式错误的 XML。除了编码混乱:

<addurl>http://www.hittadjur.se/index.php?page=case&type=&county=32&subpage=show&case=1363984558</addurl>
                                                   ^
                                                   \_ Data not properly escaped

我可能错了,但我认为您不能使用常规 XML 函数来解析它,因为它们是为有效的 XML 设计的(这就是首先使用 XML 的全部目的)。

也许您可以尝试使用DOMDocument。它是为 HTML 设计的,因此它可以处理无效输入,但它也可以处理 XML。

编辑:这是修复无效 XML 的一个技巧,但老实说,我不确定这是否值得。

于 2013-04-03T09:41:41.693 回答
0

&就像 alvaro vicario 写的那样,问题出在您的网址中的参数分隔符 ( ) 上。在 xml 中,& 符号是一个实体标记(= 命名符号(序列)的开始或字符代码点的数字表示)并且必须被转义。

在您的网址中替换&&amp;或将网址标记为文字文本(xml 中的 CDATA 部分)<![CDATA[http://...]]>:。

例如。:<addurl><![CDATA[http://www.hittadjur.se/index.php?page=case&type=&county=32&subpage=show&case=1363984558]]></addurl>

如果您对代码中的快速 utf8 转换感到不舒服,并且您知道数据源的字符编码,则可以增强 xml 序言(iso-8859-1 包含有问题的å/ 0xE5xml):

<?xml version="1.0" encoding="iso-8859-1"?>
于 2013-04-03T10:45:03.577 回答
0

如果您尝试加载服务器上保存的 xml,请尝试传递完整目录路径

simplexml_load_file($_SERVER['DOCUMENT_ROOT'].'/example.xml')

或者如果您想通过 http 协议访问 xml,您需要在 php.ini 中设置 allow_url_fopen ON 或

ini_set('allow_url_fopen ','ON');

在你的代码中。或者,如果您使用的是 php 版本 <5,您也可以这样做

$temp = file_get_contents($url);
 $XmlObj = simplexml_load_string($temp); 
于 2013-04-03T09:29:42.733 回答