更新:作为数组进行转换可以解决问题。 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寻址有明显的错误吗?
答案 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'};