1

更新:转换为数组就可以了。看到这个回复,因为我没有足够的影响力来支持:)

我从许多潜在的罪魁祸首开始处理这个问题,但经过大量诊断后,问题仍然存在,并且没有明显的答案。

我想打印地名“Gaborone”,它位于这个 API 加载的 XML 文件的第一个标记下的第一个标记下的第一个标记处。我如何解析它以返回该内容?

    <?php

      # load the XML file
      $test1 = (string)file_get_contents('http://www.afdb.org/fileadmin/uploads/afdb/Documents/Generic-Documents/IATIBotswanaData.xml');

      #throw it into simplexml for parsing      
      $xmlfile = simplexml_load_string($test1);

      #output the parsed text
      echo $xmlfile->iati-activity[0]->location[0]->gazetteer-entry;

    ?>

它永远不会返回这个:

Parse error: syntax error, unexpected '[', expecting ',' or ';'

我尝试更改语法以避免标签名称中的连字符,如下所示:

echo $xmlfile["iati-activity"][0]["location"][0]["gazetteer-entry"];

. . . 但这会返回完全的虚无;没有错误,没有来源。

我也尝试过基于这些 其他有用的 线程进行调试,但没有一个解决方案有效。我的 simplexml 寻址中是否存在明显错误?

4

2 回答 2

1

我尝试更改语法以避免标签名称中的连字符:echo $xmlfile["iati-activity"][0]["location"][0]["gazetteer-entry"];

您的问题是,对象本机转换为数组不是递归的,因此您仅对主键执行此操作。simplexml_load_string()是的,您的猜测是正确的 -由于语法问题,您不应该在处理返回值时处理对象属性。相反,您应该递归地将它 ( ) 的返回值stdclass转换为数组。您可以为此使用此功能:

  function object2array($object) { 
    return json_decode(json_encode($object), true); 
  } 

其余的部分:

  // load the XML file
  $test1 = file_get_contents('http://www.afdb.org/fileadmin/uploads/afdb/Documents/Generic-Documents/IATIBotswanaData.xml');

  $xml = simplexml_load_string($test1);

  // Cast an object into array, that makes it much easier to work with
  $data = object2array($xml);

  $data = $data['iati-activity'][0]['location'][0]['gazetteer-entry']; // Works

  var_dump($data); // string(8) "Gaborone"
于 2013-09-23T03:33:50.890 回答
0

在我进行以下字符串替换之前,我在使用 simpleXML 命令解析 XML 时遇到了类似的问题:

//$response contains the XML string
$response = str_replace(array("\n", "\r", "\t"), '', $response); //eliminate newlines, carriage returns and tabs
$response = trim(str_replace('"', "'", $response)); // turn double quotes into single quotes
$simpleXml = simplexml_load_string($response);
$json = json_decode(json_encode($simpleXml)); // an extra step I took so I got it into a nice object that is easy to parse and navigate

如果这不起作用,PHP 上有一些关于 CDATA 并不总是被正确处理的讨论——取决于 PHP 版本。

您可以在调用 simplexml_load_string 函数之前尝试此代码:

if(strpos($content, '<![CDATA[')) {
   function parseCDATA($data) {
      return htmlentities($data[1]);
   }
   $content = preg_replace_callback(
      '#<!\[CDATA\[(.*)\]\]>#',
      'parseCDATA',
      str_replace("\n", " ", $content)
   );
}

我已经重读了这个,我认为你的错误发生在你的最后一行 - 试试这个:

echo $xmlfile->{'iati-activity'}[0]->location[0]->{'gazetteer-entry'};

于 2013-09-23T00:13:11.297 回答