【问题标题】:PHP Converting XML to arrayPHP将XML转换为数组
【发布时间】: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 会发生什么

标签: php xml parsing simplexml


【解决方案1】:

这段 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>

【讨论】:

    【解决方案2】:

    最简单的方法是使用内置函数,然后转换为数组。

    <?php
    $obj = simplexml_load_string($xml); // Parse XML
    $array = json_decode(json_encode($obj), true); // Convert to array
    ?>
    

    【讨论】:

      【解决方案3】:

      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}";
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-03
        • 2016-10-03
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多