尽管看似有效的XML,PHP的SimpleXMLElement仍会返回解析错误

时间:2014-08-05 16:31:23

标签: php xml xml-parsing simplexml weather

我在通过PHP的SimpleXMLElement正确解析this XML时遇到了麻烦。我得到的错误(下面)看起来像是一个解析错误,但我似乎无法找到任何问题。而且,由于这是国家气象服务的警报提要,我不得不假设其他人正在提取这些提要并使其正常工作。

我已经尝试了以下所有内容以及它们的几种变体:

$simpleFeed = new SimpleXMLElement(simplexml_load_string(file_get_contents('http://alerts.weather.gov/cap/us.php?x=0')));

$simpleFeed = new SimpleXMLElement(simplexml_load_string('http://alerts.weather.gov/cap/us.php?x=0'));

$simpleFeed = new SimpleXMLElement('http://alerts.weather.gov/cap/us.php?x=0', NULL, TRUE);

我已经包含了我目前收到的错误,但是这些行号偶尔也会发生变化(我不确定这是我的行为还是国家气象服务#' 39; s Feed的做法:

SimpleXMLElement::__construct(): Entity: line 107: parser error : Start tag expected, '<' not found
SimpleXMLElement::__construct():  
SimpleXMLElement::__construct(): ^ 

我运行的每个XML解析器/验证器都说它有效,只有一些警告。我没有在这里看到任何表明XML是问题的东西,除了错误消息使它看起来像这样。

有没有人有这样的经历可以提供帮助?

1 个答案:

答案 0 :(得分:0)

为了免除一些误导和额外路线:

$simpleFeed = new SimpleXMLElement(simplexml_load_string(file_get_contents('http://alerts.weather.gov/cap/us.php?x=0')));

实在是太过分了。有两种方式:

  1. simplexml_load_string(file_get_contents(...))实际上只是simplexml_load_file(...)。无论是在simplexml_load_file还是file_get_contents,PHP都会在内部使用相同的图层来获取日期。它并没有受到伤害,但我认为你应该知道。
  2. 更多的伤害(在不兼容的含义中)是您无法实例化 SimpleXMLElement 作为第一个传递 SimpleXMLElement 它的构造函数的参数。那是行不通的。我想你还没有看到其他错误,你可能会认为你可以跳过&#34;跳过&#34;那些安全,但在开发和运行软件时听取错误消息实际上至关重要(参见How to get useful error messages in PHP?)。
  3. 那么这个咆哮名单怎么说呢?代码简单:

    $feedURL = http://alerts.weather.gov/cap/us.php?x=0';
    $xml     = simplexml_load_file($feedURL);
    if (!$xml) {
        throw new UnexpectedValueException(
            sprintf('failed to open %s', var_export($feedURL, true))
        );
    }
    

    这个小代码示例将为您提供 SimpleXMLElement ,否则将告诉您。您不必争论XML是否有效或解析器是否可以处理它。对于您的其余应用程序,它将是相同的。无法打开URL或成功。你无需担心别的什么。如果URL错误,请选择正确的URL。如果XML 可能被破坏,请提交错误报告。其他一切都不是你真正需要担心的事情。只是不要把代码放在一起,你不知道它是如何工作的。在这种情况下,只需阅读手册如何工作,仔细检查,故障排除,听取PHP错误消息等等,特别是将您自己的软件检查自己处理失败案例。他们在那里。为那些设计。