【问题标题】:php parse xml string [duplicate]php解析xml字符串[重复]
【发布时间】:2011-04-07 13:10:24
【问题描述】:

可能重复:
Best XML Parser for PHP

我有一个包含 XML 数据的字符串。如何在 PHP 中解析它?

谢谢

【问题讨论】:

    标签: php xml


    【解决方案1】:

    如果您熟悉 Zend 框架,请将您的 XML 传递给 Zend_Config_Xml

    像这样给定xml

    $myXml = '
    <?xml version="1.0" ?>
    <top>
      <var>value</var>
      <nested>
        <var>value</var>
      </nested>
      <arrayVar>
        <item>1</item>
        <item>2</item>
        <item>3</item>        
      </arrayVar>
    </top>';
    

    你可以这样访问它:

    $xml = new Zend_Config_Xml( $myXml );
    
    $var = $xml->var;
    $nestedVar = $xml->nested->var;
    $arrayVar = $xml->arrayVar->toArray();
    

    Zend Config XML 使用 simplexml 并在此基础上构建以提供一个漂亮的界面,这使得访问您正在寻找的 xml 节点变得非常容易。

    ZF 手册中有更多内容,包括如何访问属性以及其他一些非常有用的功能。

    http://framework.zend.com/manual/en/zend.config.adapters.xml.html

    Zend Config 是 ZF 中最容易使用的部分之一,而且(我认为)它是一个独立的组件,您可以只使用 Zend Config 而不能使用 ZF 的其他部分

    【讨论】:

      【解决方案2】:

      对于那些 SimpleXML 不可用的情况,我使用了这个函数,这个函数最初发表在 php.net 上的评论中。它在 99% 的时间里都很好用。

      <?php
      /**
       * Convert XML to an Array
       *
       * @param string  $XML
       * @return array
       */
      function XMLtoArray($XML)
      {
          $xml_parser = xml_parser_create();
          xml_parse_into_struct($xml_parser, $XML, $vals);
          xml_parser_free($xml_parser);
          // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
          $_tmp='';
          foreach ($vals as $xml_elem) {
              $x_tag=$xml_elem['tag'];
              $x_level=$xml_elem['level'];
              $x_type=$xml_elem['type'];
              if ($x_level!=1 && $x_type == 'close') {
                  if (isset($multi_key[$x_tag][$x_level]))
                      $multi_key[$x_tag][$x_level]=1;
                  else
                      $multi_key[$x_tag][$x_level]=0;
              }
              if ($x_level!=1 && $x_type == 'complete') {
                  if ($_tmp==$x_tag)
                      $multi_key[$x_tag][$x_level]=1;
                  $_tmp=$x_tag;
              }
          }
          // jedziemy po tablicy
          foreach ($vals as $xml_elem) {
              $x_tag=$xml_elem['tag'];
              $x_level=$xml_elem['level'];
              $x_type=$xml_elem['type'];
              if ($x_type == 'open')
                  $level[$x_level] = $x_tag;
              $start_level = 1;
              $php_stmt = '$xml_array';
              if ($x_type=='close' && $x_level!=1)
                  $multi_key[$x_tag][$x_level]++;
              while ($start_level < $x_level) {
                  $php_stmt .= '[$level['.$start_level.']]';
                  if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                      $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
                  $start_level++;
              }
              $add='';
              if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
                  if (!isset($multi_key2[$x_tag][$x_level]))
                      $multi_key2[$x_tag][$x_level]=0;
                  else
                      $multi_key2[$x_tag][$x_level]++;
                  $add='['.$multi_key2[$x_tag][$x_level].']';
              }
              if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
                  if ($x_type == 'open')
                      $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                  else
                      $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
                  eval($php_stmt_main);
              }
              if (array_key_exists('attributes', $xml_elem)) {
                  if (isset($xml_elem['value'])) {
                      $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                      eval($php_stmt_main);
                  }
                  foreach ($xml_elem['attributes'] as $key=>$value) {
                      $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                      eval($php_stmt_att);
                  }
              }
          }
          return $xml_array;
      }
      ?>
      

      【讨论】:

        【解决方案3】:

        试试simple XML,这是一个例子:

        do.php:

        <?php
        $xml_str = file_get_contents('xmlfile.xml');
        $xml = new SimpleXMLElement($xml_str);
        $items = $xml->xpath('*/item');
        
        foreach($items as $item) {
            echo $item['title'], ': ', $item['description'], "\n";
        }
        

        xmlfile.xml:

        <?xml version="1.0" encoding="UTF-8"?>
        <xml>
            <items>
                <item title="Hello World" description="Hellowing the world.." />
                <item title="Hello People" description="greeting people.." />
            </items>
        </xml>
        

        【讨论】:

          猜你喜欢
          • 2012-03-23
          • 2013-05-27
          • 2013-03-04
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          • 1970-01-01
          • 1970-01-01
          • 2016-06-20
          相关资源
          最近更新 更多