simplexml_load_string和不受欢迎的解析错误

时间:2013-09-23 00:06:23

标签: php xml api simplexml

更新:作为数组进行转换可以解决问题。 See this response,因为我没有足够的影响力来投票:)

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

我想打印地名“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"];

。 。 。但这会让完全虚无;没有错误,没有来源。

我也尝试过基于these otherwise-helpful threads的调试,但没有一个解决方案有效。我的simplexml寻址有明显的错误吗?

2 个答案:

答案 0 :(得分:1)

  

我尝试更改语法以避免标记名称中的连字符   如此:回声   $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"

答案 1 :(得分: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

如果这不起作用,那就是some talk over at PHP about CDATA not always being handled properly - 取决于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-&gt; {'iati-activity'} [0] - &gt; location [0] - &gt; {'gazetteer-entry'};