PHP Преобразование XML в массив - PullRequest
1 голос
/ 10 ноября 2011

Я пытался найти способ конвертировать любой 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, уведомлений и без потери каких-либо данных.

Можете ли вы найти изъян в этом иликанал, который не работает?Это сработало для всего, для чего я его тестировал.

Ответы [ 3 ]

5 голосов
/ 06 апреля 2013

Самый простой способ сделать это - использовать встроенные функции, а затем преобразовать их в массив.

<?php
$obj = simplexml_load_string($xml); // Parse XML
$array = json_decode(json_encode($obj), true); // Convert to array
?>
0 голосов
/ 25 сентября 2013

http://php.net/manual/en/book.simplexml.php

Синтаксис выглядит примерно так для вашего примера

<aaaa Version="1.0">
   <bbb>
     <cccc>
       <dddd Id="id:pass" />
       <eeee name="hearaman" age="24" />
     </cccc>
   </bbb>
</aaaa>

PHP-код

<?php
$xml = new SimpleXMLElement($xmlString);
echo $xml->bbb->cccc->dddd['Id'];
echo $xml->bbb->cccc->eeee['name'];
// or...........
foreach ($xml->bbb->cccc as $element) {
  foreach($element as $key => $val) {
   echo "{$key}: {$val}";
  }
}
0 голосов
/ 11 апреля 2012

Этот фрагмент XML, похоже, ломает его.

<BackupJob ID="2011-11-09-05-00-00" StartTime="2011-11-09 04:56:51" EndTime="2011-11-09 05:02:01" BackupJobStatus="BS_STOP_SUCCESS" NumOfWarnEntries="0" NumOfErrorEntries="0" NumOfNewFiles="0" TotalNewFilesSize="0" NumOfUpdatedFiles="1" TotalUpdatedFilesSize="8709755" NumOfDeletedFiles="0" TotalDeletedFilesSize="0" NumOfMovedFiles="0" TotalMovedFilesSize="0" NumOfUpdatedPermissionFiles="0" TotalUpdatedPermissionFilesSize="0"></BackupJob>
...