【问题标题】:Problem with parsing xml file using php. Url address doesn't contain .xml extension使用 php 解析 xml 文件的问题。网址地址不包含 .xml 扩展名
【发布时间】:2010-10-15 09:38:14
【问题描述】:

大家好。我正在尝试解析 xml 文件,以便从中提取一些数据并将其显示在网站上。但是,当我使用不以 .xml 扩展名结尾的 url 时,我无法在结果上运行 foreach 循环。换句话说,当我使用这种 url 时:

$url = http://www.example.com/some_xml_file.xml

我可以在它上面运行一个 foreach 循环,它就像魅力一样。但是这一次我必须处理这种类型的 url:

$url = http://www.example.com/?some_var=something&some=something

所以你可以清楚地看到它不包含.xml 扩展名。它返回了很好的解析结果,但我无法让 foreach 循环处理这个结果,因此我无法从中提取任何数据。你能帮我解决这个问题吗?

我在做什么的例子:

$url = 'http://www.example.com/?some_var=something&some=somethinge';

    $sx = simplexml_load_file($url);

    foreach ($sx->response as $row)
    {
        echo $row['status'];

    }

这是 var_dump($sx) 的结果:

object(SimpleXMLElement)#334 (2) { ["@attributes"]=>  array(2) { ["status"]=>  string(2) "ok" ["version"]=>  string(3) "1.0" } ["events"]=>  object(SimpleXMLElement)#333 (2) { ["@attributes"]=>  array(3) { ["resultCount"]=>  string(1) "1" ["pageSize"]=>  string(2) "15" ["pageIndex"]=>  string(1) "0" } ["event"]=>  object(SimpleXMLElement)#338 (10) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "180085" } ["name"]=>  string(27) "Lady Gaga Monster Ball Tour" ["doordatetime"]=>  string(19) "2010-11-01T18:30:00" ["tickets"]=>  object(SimpleXMLElement)#337 (1) { ["ticket"]=>  array(5) { [0]=>  object(SimpleXMLElement)#339 (7) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "307902" } ["price"]=>  string(7) "£55.00" ["url"]=>  string(32) "http://www.gigjunkie.net/T307902" ["provider"]=>  string(12) "Ticketmaster" ["soldout"]=>  string(5) "false" ["ticketsavailable"]=>  string(4) "true" ["issecondary"]=>  string(5) "false" } [1]=>  object(SimpleXMLElement)#340 (7) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "426248" } ["price"]=>  string(7) "£82.00" ["url"]=>  string(32) "http://www.gigjunkie.net/T426248" ["provider"]=>  string(8) "Seatwave" ["soldout"]=>  string(5) "false" ["ticketsavailable"]=>  string(4) "true" ["issecondary"]=>  string(4) "true" } [2]=>  object(SimpleXMLElement)#437 (6) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "306230" } ["url"]=>  string(32) "http://www.gigjunkie.net/T306230" ["provider"]=>  string(7) "Viagogo" ["soldout"]=>  string(5) "false" ["ticketsavailable"]=>  string(4) "true" ["issecondary"]=>  string(4) "true" } [3]=>  object(SimpleXMLElement)#438 (6) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "325819" } ["url"]=>  string(32) "http://www.gigjunkie.net/T325819" ["provider"]=>  string(15) "WorldTicketShop" ["soldout"]=>  string(5) "false" ["ticketsavailable"]=>  string(4) "true" ["issecondary"]=>  string(4) "true" } [4]=>  object(SimpleXMLElement)#342 (6) { ["@attributes"]=>  array(1) { ["id"]=>  string(6) "402593" } ["url"]=>  string(32) "http://www.gigjunkie.net/T402593" ["provider"]=>  string(14) "Empire Tickets" ["soldout"]=>  string(5) "false" ["ticketsavailable"]=>  string(4) "true" ["issecondary"]=>  string(4) "true" } } } ["venue"]=>  object(SimpleXMLElement)#336 (9) { ["@attributes"]=>  array(1) { ["id"]=>  string(4) "1479" } ["name"]=>  string(13) "Odyssey Arena" ["street"]=>  string(13) "2 Queens Quay" ["town"]=>  string(7) "Belfast" ["nameandtown"]=>  string(22) "Odyssey Arena, Belfast" ["country"]=>  string(2) "GB" ["gjurl"]=>  string(90) "http://www.gigjunkie.net/gigs/Lady-Gaga-Monster-Ball-Tour/Odyssey-Arena/01-Nov-2010/180085" ["latitude"]=>  string(9) "54.602158" ["longitude"]=>  string(9) "-5.918215" } ["gjurl"]=>  string(90) "http://www.gigjunkie.net/gigs/Lady-Gaga-Monster-Ball-Tour/Odyssey-Arena/01-Nov-2010/180085" ["artists"]=>  object(SimpleXMLElement)#341 (1) { ["artist"]=>  object(SimpleXMLElement)#332 (5) { ["@attributes"]=>  array(2) { ["id"]=>  string(5) "54194" ["isprimary"]=>  string(4) "true" } ["name"]=>  string(9) "Lady Gaga" ["gjurl"]=>  string(42) "http://www.gigjunkie.net/artists/Lady-Gaga" ["thumbnailimage"]=>  string(68) "http://images.gigjunkie.net/f5376fab-cd01-4432-9205-8a1d0be41437.jpg" ["mediumimage"]=>  string(68) "http://images.gigjunkie.net/efbe624c-b63d-452a-a89b-221e846147ab.jpg" } } ["iscancelled"]=>  string(5) "false" ["genre"]=>  string(8) "Rock/Pop" ["image"]=>  string(68) "http://images.gigjunkie.net/efbe624c-b63d-452a-a89b-221e846147ab.jpg" } } } 

【问题讨论】:

  • 您能否发布(至少是开头)您的数据检索和处理代码?
  • 您的新示例有点错误——如果您按照 Cristian 的建议执行 simplexml_load_file(url),则您也不需要 simplexml_load_string()。 simplexml_load_file() 将直接返回一个 XML 对象,因此您不需要 file_get_contents() 或 simplexml_load_string()。只需使用$sx = simplexml_load_file($url) 并像现在一样在$sx 上运行foreach
  • 你是否建议做类似的事情:$sx = simplexml_load_file($url); foreach ($sx->response as $row) { echo $row['status']; }
  • @Pavel 是的,应该可以。 simplexml_load_file() 创建一个 SimpleXML 对象,您应该可以直接使用它。它基本上是您最初通过将文件加载到字符串中然后从字符串创建 SimpleXML 对象的快捷方式。
  • 当我运行 var_dump($sx) 时,它会很好地返回结果 - 这就是为什么我不明白为什么我不能在其上运行 foreach 循环:/

标签: php javascript wordpress


【解决方案1】:

只需使用simplexml_load_file函数,如果无法解析xml,它将返回False

<?php
$url = 'http://www.example.com/?some_var=something&some=something'
if(simplexml_load_file($url)){
    // is a xml
else {
    // no xml found
}
?>

您可以在这里找到更多信息:http://www.php.net/manual/en/function.simplexml-load-file.php

【讨论】:

  • 这里不是这样。我知道它正在解析它,但我无法在解析结果上运行 foreach 循环。
  • 请发布结果:foreach ($sx->response as $row) { print_r($row); }
  • 另外,如果您没有从 foreach 中获得任何结果,则可能值得通过 var_dump($sx) 进行健全性检查。
  • 当我运行 var_dump($sx) 时,它会很好地返回结果 - 这就是为什么我不明白为什么我不能在其上运行 foreach 循环:/
  • @Pavel 您能否将 var_dump 的结果添加到您的问题中,好吗?可能会给我们一些东西继续下去。塔。
【解决方案2】:

您的处理似乎与您的 XML 文档结构不匹配。您的处理似乎需要这样的文件:

<some_document>
  <response status="ok">...</response>
  <response status="ok">...</response>
  ...
</some_document>

但是,从您的 var_dump 的外观来看,实际文档的结构并非如此。这就是为什么你不能用 foreach() 迭代“响应”元素的原因——我认为没有任何东西可以迭代。

如果您可以发布实际的 XML 文档,我们可能会修复您的处理以匹配它。

我认为,要记住的主要一点是 SimpleXMLElement 的工作方式是,您返回的对象是 XML 文档的根,所以如果您的文档如下所示:

<response>
   <some_data>...</some_data>
   <some_other_data>...</some_other_data>
</response>

...那么$sx-&gt;response 将不存在。 $sx &lt;response&gt; 元素,它不包含它。

【讨论】:

  • 所以基本上我应该将输出保存在一个文件中,比如file.xml,把它放在我的服务器上,然后解析这个以提取我需要的值,对吗?
  • @Pavel 不,我的意思是你可以做你正在做的事情,但是与你的 XML 文件的结构相比,你的处理有点错误。您能否发布您正在尝试处理的实际 XML 源文档?
  • 感谢马特,我终于能够解决这个问题了。基本上我所做的是从树中的第二个元素开始循环。很好的提示!
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多