【发布时间】:2011-12-25 16:45:16
【问题描述】:
我试图找到一种将任何 xml 提要转换为关联数组的方法,我注意到许多其他人都在寻找相同的东西,并且已经进行了很多尝试,其中一些失败了,我找到了以下方法这样做,功劳归于
http://gaarf.info/2009/08/13/xml-string-to-php-array/
我稍微修改了代码,结果如下。
function xmlNameSpaceToArray(SimpleXmlIterator $xml, $nameSpaces=Null){
$output = Null;
$preparedArray = array();
for($xml->rewind(); $xml->valid(); $xml->next()) {
$key = $xml->key();
if(!isset($preparedArray[$key])) { $preparedArray[$key] = array(); $i=0; }
else $i = count($preparedArray[$key]);
$simple = true;
foreach($xml->current()->attributes() as $k=>$v) {
$preparedArray[$key][$i][$k]=(string)$v;
$simple = false;
}
if($nameSpaces) foreach($nameSpaces as $nid=>$name) {
foreach($xml->current()->attributes($name) as $k=>$v) {
$preparedArray[$key][$i][$nid.':'.$k]=(string)$v;
$simple = false;
}
}
if($xml->hasChildren()) {
if($simple) $preparedArray[$key][$i] = xmlNameSpaceToArray($xml->current(), $nameSpaces);
else $preparedArray[$key][$i]['content'] = xmlNameSpaceToArray($xml->current(), $nameSpaces);
} else {
if($simple) $preparedArray[$key][$i] = strval($xml->current());
else $preparedArray[$key][$i]['content'] = strval($xml->current());
}
$i++;
}
$output = $preparedArray;
return $preparedArray;
}
function xmlToArray($xmlFilePath){
$xml = new SimpleXmlIterator($xmlFilePath , null, true);
$nameSpaces = $xml->getNamespaces(true);
$output = xmlNameSpaceToArray($xml,$nameSpaces);
return $output;
}
$xmlFilePath = 'http://forums.devshed.com/rss/feed-5.xml';
$output = xmlToArray($xmlFilePath);
print_r($output);
我现在试图找出的是这可能存在的潜在问题,目标是让每个结构良好的 XML 提要都能正常工作,没有任何 php 警告、通知并且不会丢失任何数据。
您能找到其中的缺陷或无法正常工作的提要吗?它适用于我测试的所有内容。
【问题讨论】:
-
什么是
$xml?如果你想给予学分,请同时命名作者,而不仅仅是粘贴链接。 -
$xml 是一个对象,它是 PHP SimpleXml 的 SimpleXmlIterator 类的实例。我在函数中添加了数据类型定义以使其更清晰,请注意您不需要直接使用该函数。我不知道作者的名字。
-
您可以删除
$output = Null;和$output = $preparedArray;行,因为它们在一起并没有真正做任何事情,特别是因为您返回$preparedArray -
我想不出用结构良好的 XML 来打破它的方法。我想更有趣的是格式不正确的 XML 会发生什么