【问题标题】:Warning: simplexml_load_file() [function.simplexml-load-file]: xml/xml_test.php:5: parser error : Start tag expected, '<' not found警告:simplexml_load_file() [function.simplexml-load-file]:xml/xml_test.php:5:解析器错误:需要开始标记,未找到“<”
【发布时间】:2015-03-26 02:30:34
【问题描述】:

我知道有人问过很多这样的问题,我已经阅读了很多答案,但仍然不断出错。我创建了一个用于测试目的的简单版本,并得到与我的主脚本相同的错误。我确信这很简单,但我已经与它斗争了好几个小时,并且正在为此脱发。

Demo XML 文件用 PHP 生成(这个是静态的,用来模拟我的真实文件生成的,在这个文件上测试得到以下错误):

<?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 文件。

标签: php xml


【解决方案1】:

您的 XML 文档无效。一个有效的 XML 文档可以选择以 XML 声明开头,并且至少包含一个文档元素。

您拥有的文档仅包含一条处理指令。那是无效的:

<?php
   ...
?>

为了让 SimpleXML 加载和解析文档,您至少需要用这样的文档元素包装它,我冒昧地将其命名为 &lt;doc&gt;,在以下示例中:

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

我猜这很可能更符合您的期望。

【讨论】:

  • 我能够使用 load_string 来读取文件而不会出现错误,并获得像您的第一个 SimpleXMLElement 输出一样的输出,但是如何读取 SimpleXMLElement 对象的值? $token1=$xml_search->user[0]->search_tkID;为空白。由于实际的 XML 内容是根据查询字符串的输入动态生成的,因此我不想每次都将它们写入磁盘。
  • 创建一个生成 XML 的函数。然后在两个脚本中使用该函数。
【解决方案2】:

答案:我需要读取 URL,而不仅仅是文件名,以执行生成 XML 输出的 PHP,而不是 simpleXML 读取的。如此微小的差异让我好几个小时。如果要执行 PHP,则不允许使用相对路径。

$path = "http://wwww.site.com/xml/xml_test.php";
$xml_search = simplexml_load_file($path);
print_r($xml_search);

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2016-06-23
    • 2017-02-17
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多