我知道有人问过很多这样的问题,我读过很多答案,但仍然不断出错。出于测试目的,我创建了一个简单的版本,并得到了与主脚本相同的错误。我相信这很简单,但我已经和它斗争了好几个小时,而且我正在为此而脱发。
在PHP中生成的演示XML文件(这个文件是静态的,以模拟我的真实文件生成的内容,对这个文件的测试得到了以下错误):
<?php
header("Content-type: text/xml");
print "<?xml version='"1.0'" encoding='"UTF-8'"?>";
echo "
<users>
<user>
<search_tkID>5</search_tkID>
<search_connection>1</search_connection>
<search_name>Daniel Appleseed</search_name>
<search_pic>0</search_pic>
</user>
<user>
<search_tkID>4</search_tkID>
<search_connection>1</search_connection>
<search_name>Danny Apple</search_name>
<search_pic>0</search_pic>
</user>
<count>
<number>2</number>
</count>
</users>";
?>
PHP文件尝试读取此文件:
$path = "xml/xml_test.php";
$xml_search = simplexml_load_file($path);
print_r($xml_search);
PHP页面输出的错误消息:
Warning: simplexml_load_file() [function.simplexml-load-file]: xml/xml_test.php:5: parser error : Start tag expected, '<' not found in MYPAGE.php on line 16
Warning: simplexml_load_file() [function.simplexml-load-file]: print "<?xml version='"1.0'" encoding='"UTF-8'"?>"; in MYPAGE.php on line 16
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in MYPAGE.php on line 16
您的XML文档无效。有效的XML文档可以选择以XML声明开头,并且至少有一个文档元素。
您所拥有的文档仅包含一个处理说明。无效:
<?php
...
?>
为了让SimpleXML加载和解析文档,您至少需要用这样一个文档元素来包装它,我在下面的示例中将其命名为<doc>
:
$path = "xml/xml_test.php";
$buffer = file_get_contents($path);
$xml_search = simplexml_load_string("<doc>$buffer</doc>");
print_r($xml_search);
它应该显示一些沿线的输出:
SimpleXMLElement Object
(
[php] => SimpleXMLElement Object
(
)
[users] => SimpleXMLElement Object
(
...
实际的XML文档也可以输出(我建议通过print_r
输出,因为print_r
的输出可能会有点误导SimpleXMLElements:
$xml_search->asXML('php://output');
输出:
<?xml version="1.0"?>
<doc><?php header("Content-type: text/xml");
print "<?xml version='"1.0'" encoding='"UTF-8'"?>";
echo "
<users>
<user>
...
我希望您现在能更好地理解您试图加载的实际XML文档。
最后,最好将XML作为.xml
文件逐字逐句地存储在磁盘上,然后将其加载到这两个PHP文件中。
文件xml/xml_test.php
:
<?php
header("Content-type: text/xml");
readfile('result.xml');
另一个文件:
$path = "xml/result.xml";
$xml_search = simplexml_load_file($path);
...
我想这很可能更符合你的期望。
答案是:我需要读取URL,而不仅仅是文件名,以执行PHP,该PHP将生成simpleXML读取的XML输出。如此微小的差异让我好几个小时都筋疲力尽。如果您想执行PHP,则不允许使用相对路径。
$path = "http://wwww.site.com/xml/xml_test.php";
$xml_search = simplexml_load_file($path);
print_r($xml_search);